Spiral Array

문제는 다음과 같다:

6 6

  0   1   2   3   4   5
 19  20  21  22  23   6
 18  31  32  33  24   7
 17  30  35  34  25   8
 16  29  28  27  26   9
 15  14  13  12  11  10

위처럼 6 6이라는 입력을 주면 6 X 6 매트릭스에 나선형 회전을 한 값을 출력해야 한다.

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

123개의 풀이가 있습니다. 1 / 13 Page

# Get & validate input values
while True:
    inp = input()
    if len(inp) < 3:
        print('Invalid input.')
        continue

    inps = inp.split(' ')
    rows = int(inps[0])
    cols = int(inps[1])

    if rows <= 0 or cols <= 0:
        print('Invalid input.')
        continue

    break

# Prepare numbers to fill
nums = list(range(rows*cols))
# filling direction
dirc = [[0, 1], [1, 0], [0, -1], [-1, 0]]
# Prepare empty spiral matrix
spmatrix = [[-1 for col in range(cols)] for row in range(rows)]

# Fill spiral matrix
i = 0
r = 0
c = 0
dmode = 0
while i < rows*cols:
    spmatrix[r][c] = nums[i]

    tmp_r = r + dirc[dmode][0]
    tmp_c = c + dirc[dmode][1]

    # Inspect conditions to change direction
    if  tmp_r < 0 or tmp_r  >= rows or tmp_c < 0 or tmp_c >= cols  or spmatrix[tmp_r][tmp_c] !=-1:
        dmode +=1
        dmode %= 4

    r += dirc[dmode][0]
    c += dirc[dmode][1]

    i += 1

# Print the result
for i in range(rows):
    for j in range(cols):
        print("{0:>2}".format(spmatrix[i][j]), end=' ')
    print();

매 루프마다 채우는 방향을 바꿔야 하는 조건을 테스트하는 방식으로 풀었습니다.

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
/*

dev : peanuBro

date : 170218

content :

6 6

 0   1   2   3   4   5
19  20  21  22  23   6
18  31  32  33  24   7
17  30  35  34  25   8
16  29  28  27  26   9
15  14  13  12  11  10

위처럼 6 6이라는 입력을 주면 6 X 6 매트릭스에 나선형 회전을 한 값을 출력해야 한다.

*/

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

#include <iostream>
#include <iomanip>

using namespace std;

int main(void)
{
    int currentX=0;
    int currentY=0;
    int findCount = 0;

    int maxX;
    int maxY;
    int **arr;

    enum class Direction{UP, DOWN, RIGHT, LEFT};
    int flagCourse;

    cout << "X Y 입력 : ";
    cin >> maxX >> maxY;

    arr = new int*[maxY];
    for (int i = 0; i < maxY; i++)
    {
        arr[i] = new int[maxX];
        for (int j = 0; j < maxX; j++)
        {
            arr[i][j] = -1;
        }
    }

    arr[currentY][currentX] = findCount;
    flagCourse = ((int)Direction::RIGHT);

    while (true)
    {
        switch (flagCourse)
        {
            case (int)Direction::UP:
            {
                if (currentY == 0)
                {
                    flagCourse = (int)Direction::RIGHT;
                }
                else
                {
                    if (arr[currentY - 1][currentX] == -1)
                    {
                        arr[--currentY][currentX] = ++findCount;
                    }
                    else
                    {
                        flagCourse = (int)Direction::RIGHT;
                    }
                }
                break;
            }
            case (int)Direction::DOWN:
            {
                if (currentY == (maxY-1))
                {
                    flagCourse = (int)Direction::LEFT;
                }
                else
                {
                    if (arr[currentY+1][currentX] == -1)
                    {
                        arr[++currentY][currentX] = ++findCount;
                    }
                    else
                    {
                        flagCourse = (int)Direction::LEFT;
                    }
                }
                break;
            }
            case (int)Direction::RIGHT:
            {
                if (currentX == (maxX-1))
                {
                    flagCourse = (int)Direction::DOWN;
                }
                else
                {
                    if (arr[currentY][currentX + 1] == -1)
                    {
                        arr[currentY][++currentX] = ++findCount;
                    }
                    else
                    {
                        flagCourse = (int)Direction::DOWN;
                    }
                }

                break;
            }
            case (int)Direction::LEFT:
            {
                if (currentX == 0)
                {
                    flagCourse = (int)Direction::UP;
                }
                else
                {
                    if (arr[currentY][currentX -1] == -1)
                    {
                        arr[currentY][--currentX] = ++findCount;
                    }
                    else
                    {
                        flagCourse = (int)Direction::UP;
                    }
                }
                break;
            }
            default:
            {
                break;
            }
        }
        if (findCount == (maxX*maxY)-1)
        {
            break;
        }
    }
    for (int i = 0; i < maxY; i++)
    {
        for (int j = 0; j < maxX; j++)
        {
            cout << setw(5) << arr[i][j] ;
        }
        cout << endl;
    }
}


※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
import numpy as np

def Spiral(m, n):
    mat = np.zeros([m, n])
    k = 0
    p = 0
    while p <= min(m, n)/2:
        for i in range(p, n-1-p):
            mat[p,i] = k
            k += 1

        for i in range(p, m-1-p):
            mat[i, n-1-p] = k
            k += 1

        for i in range(n-1-p, p, -1):
            mat[m-1-p, i] = k
            k += 1

        for i in range(m-1-p, p, -1):
            mat[i, p] = k
            k += 1
        p += 1
    if n%2 != 0:
        mat[n//2, n//2] = k
    return mat
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#include<iostream>
using namespace std;

void dal_array(int in1, int in2)
{
    int count = 0;
    int x_cnt = 0;
    int y_cnt = 0;
    int **arr = new int*[in1];
    for (int i = 0; i < in1; ++i) {
        arr[i] = new int[in2];
        memset(arr[i], 0, sizeof(int)*in2);
    }
    for(int k=0; k<in1/2;k++)
    {
        //->
        for (int i = 0 + x_cnt; i < in2 - x_cnt; i++)
        {
            arr[y_cnt][i] = count++;
        }
        //V
        for (int i = 1 + y_cnt; i < in1 - y_cnt; i++)
        {
            arr[i][in1 - y_cnt-1] = count++;
        }
        //<
        for (int i = in2 - (x_cnt+2); i >= x_cnt; i--)
        {
            arr[in1 - y_cnt-1][i] = count++;
        }
        //^
        for (int i = in1 - (y_cnt+2); i > y_cnt; i--)
        {
            arr[i][x_cnt] = count++;
        }
        x_cnt++;
        y_cnt++;
    }

    for (int i = 0; i < in1; i++)
    {
        for (int j = 0; j < in2; j++)
        {
            cout << arr[i][j] << "  ";
        }
        cout << endl;
    }


    //동적할당해지
    for (int i = 0; i < in1; ++i) {
        delete[] arr[i];
    }
    delete[] arr;

}

int main()
{
    int input1, input2;

    cout << "숫자를 입력하세요 .";
    cin >> input1 >> input2;

    dal_array(input1, input2);
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int height , width ;
    int h_sign = 1, w_sign = 1;
    int h= 0, w= 0;
    int sum = 1;
    int **arr;

    scanf("%d %d", &width, &height);

    arr = (int**)malloc(sizeof(int*) * height+1);
    for (int i = 0; i < height; i++) 
    {
        arr[i] = (int*)malloc(sizeof(int) * width);
        memset(arr[i],0,sizeof(int)*width);
    }
    arr[height] = (int*)malloc(sizeof(int) * width);

    arr[h][w] = 1;
    for (int i = 0; i < height; i++)
    {
        while (arr[h][w+w_sign]==0)
        {
            sum += 1;
            w += 1 * w_sign;
            arr[h][w] = sum;
        }
        while (arr[h+h_sign][w] == 0)
        {
            sum += 1;
            h += 1 * h_sign;
            arr[h][w] = sum;
        }
        h_sign = h_sign*-1;
        w_sign = w_sign*-1;
    }
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            printf("%2d ",arr[i][j]-1);
        }
        printf("\n");
    }
}

동적 메모리할당을 이용해 2차원 배열로 만들어서 해봤습니다.

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

너무 무식하게 풀었네요 :)

package com.genius.vernum;

public class SpiralArray {

    static int[][] tableA = new int[6][6];
    static int[][] tableB = new int[6][6];

    public static void main(String[] args) {
        int k = 0;
        for (int i = 0; i < 6; i++) {
            tableA[0][i % 6] = k;
            tableB[0][i % 6] = k;
            k++;
        }
        rightRotationA();
        rightRotationB();

        for (int i = 0; i < 5; i++) {
            tableA[0][(i % 6) + 1] = k;
            tableB[0][(i % 6) + 1] = k;
            k++;
        }
        rightRotationA();
        rightRotationB();

        for (int i = 0; i < 5; i++) {
            tableA[0][(i % 5) + 1] = k;
            tableB[0][(i % 5) + 1] = k;
            k++;
        }
        rightRotationA();
        rightRotationB();

        for (int i = 0; i < 4; i++) {
            tableA[0][(i % 4) + 1] = k;
            tableB[0][(i % 4) + 1] = k;
            k++;
        }
        rightRotationA();
        rightRotationB();

        for (int i = 0; i < 4; i++) {
            tableA[1][(i % 4) + 1] = k;
            tableB[1][(i % 4) + 1] = k;
            k++;
        }
        rightRotationA();
        rightRotationB();

        for (int i = 0; i < 3; i++) {
            tableA[1][(i % 3) + 2] = k;
            tableB[1][(i % 3) + 2] = k;
            k++;
        }
        rightRotationA();
        rightRotationB();

        for (int i = 0; i < 3; i++) {
            tableA[1][(i % 3) + 2] = k;
            tableB[1][(i % 3) + 2] = k;
            k++;
        }
        rightRotationA();
        rightRotationB();

        for (int i = 0; i < 2; i++) {
            tableA[1][(i % 2) + 2] = k;
            tableB[1][(i % 2) + 2] = k;
            k++;
        }
        rightRotationA();
        rightRotationB();

        for (int i = 0; i < 2; i++) {
            tableA[2][(i % 2) + 2] = k;
            tableB[2][(i % 2) + 2] = k;
            k++;
        }
        rightRotationA();
        rightRotationB();

        for (int i = 0; i < 1; i++) {
            tableA[2][(i % 1) + 3] = k;
            tableB[2][(i % 1) + 3] = k;
            k++;
        }
        rightRotationA();
        rightRotationB();

        for (int i = 0; i < 1; i++) {
            tableA[2][(i % 1) + 3] = k;
            tableB[2][(i % 1) + 3] = k;
            k++;
        }
        rightRotationA();
        rightRotationB();
        rightRotationA();
        rightRotationB();

        printTableA();
    }

    static void rightRotationA() {
        for (int i = 0; i < 6; i++) {
            for (int j = 0; j < 6; j++) {
                tableA[i][j] = tableB[j][5 - i];
            }
        }
    }

    static void rightRotationB() {
        for (int i = 0; i < 6; i++) {
            for (int j = 0; j < 6; j++) {
                tableB[i][j] = tableA[i][j];
            }
        }
    }

    static void printTableA() {
        for (int i = 0; i < 6; i++) {
            for (int j = 0; j < 6; j++) {
                System.out.print(tableA[i][j] + "\t");
            }
            System.out.println("");
        }
    }
}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
package codingdojang;

import java.util.Arrays;
import java.util.Scanner;

public class Number2 {

    public static void main(String[] args) {

          Scanner scan = new Scanner(System.in);          
          String[] input = scan.nextLine().split(" ");        
          scan.close();

          int[] step = Arrays.stream(input).mapToInt(Integer::parseInt).toArray();

          int xInput = step[0];
          int yInput = step[1];
          int max = xInput * yInput;

          int[] p = {0, 1};

          int x = 0;
          int y = -1;

          Integer[][] matrix = new Integer[xInput][yInput];

          int value = 0;
          boolean isGoing = true;

          while(isGoing) {

              for ( int i = 0; i < step[1]; i++ ) {

                  x += p[0];
                  y += p[1];
                  matrix[x][y] = value;
                  value++;

                  isGoing = checkValue(value, max);
                  if (!isGoing)
                      break;

              }

              for ( int i = 0; i < (step[0] - 1); i++ ) {

                  x += p[1];
                  y += p[0];
                  matrix[x][y] = value;
                  value++;

                  isGoing = checkValue(value, max);
                  if (!isGoing)
                      break;

              }

              step[0]--;
              step[1]--;
              p[1] *= -1;

          }

          for ( int i = 0; i < xInput; i++ ) {

              for ( int j = 0; j < yInput; j++ ) {

                  System.out.printf("%5d", matrix[i][j]);

              }

              System.out.println();

          }


    }

    private static boolean checkValue(int value, int max) {

        return value >= max ? false : true;

    }

}

자바로 작성했습니다.

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
input = raw_input().split(" ")
print input

xInput = int(input[0])
yInput = int(input[1])

xStep, yStep = xInput, yInput
max = xInput * yInput

x, y = 0, -1

p = [0, 1]

matrix = [[0]*yInput for i in xrange(xInput)]

value = 0
isGoing = 1

while(isGoing):

    for i in xrange(1, yStep + 1):

        x += p[0]
        y += p[1]
        matrix[x][y] = value
        value += 1

        if value >= max:
            isGoing = 0
            break

    for i in xrange(1, xStep):

        x += p[1]
        y += p[0]
        matrix[x][y] = value
        value += 1      

        if value >= max:
            isGoing = 0
            break

    xStep -= 1
    yStep -= 1
    p[1] *= -1

for i in xrange(0, xInput):

    for j in xrange(0, yInput):

        print("%5d" % matrix[i][j]),

    print ""

파이썬으로 작성했습니다.

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#include <stdio.h>


int main()
{

    int inPutCol, inPutRow;
    int i, j;
    int matrixNum;
    int cnt;
    int flag;
    int tempRow, tempCol,outPutRow,outPutCol;
    int arrMatrix[100][100];
    inPutCol = 0;
    inPutRow = 0;

    printf("숫자를 입력하세요 : ");
    scanf("%d %d", &inPutCol, &inPutRow);
    outPutRow = inPutRow;
    outPutCol = inPutCol;

    tempRow = -1;
    tempCol = 0;

    matrixNum = 1;
    cnt = inPutCol*inPutRow;

    j = 0;
    i = 0;
    flag = 1;

    while (cnt > 0)
    {
        if (flag == 1)
        {
            printf("flag = %d \n", flag);
            for (i = 0; i < inPutRow; i++)
            {
                tempRow = tempRow + flag;
                arrMatrix[tempCol][tempRow] = matrixNum;

                printf("[%d,%d]  = %d \n", j+1, tempRow+1, matrixNum);


                matrixNum++;
                cnt--;

            }

            for (j = 1; j < inPutCol; j++)
            {
                tempCol = tempCol + flag;

                arrMatrix[tempCol][tempRow] = matrixNum;
                printf("[%d,%d]  = %d \n", tempCol+1, tempRow+1, matrixNum);

                matrixNum++;
                cnt--;

            }

            inPutCol--;
            inPutRow--;

            flag = flag*(-1);
        }
        else
        {
            printf("flag = %d \n", flag);

            for (j = 0; j < inPutRow; j++)
            {
                tempRow--;
                arrMatrix[tempCol][tempRow] = matrixNum;
                printf("[%d,%d]  = %d \n", tempCol+1, tempRow+1, matrixNum);

                matrixNum++;

                cnt--;

            }



            for (j = 1; j < inPutCol; j++)
            {
                tempCol--;
                arrMatrix[tempCol][tempRow] = matrixNum;
                printf("[%d,%d]  = %d \n", tempCol+1, tempRow+1, matrixNum);

                matrixNum++;
                cnt--;

            }

            inPutCol--;
            inPutRow--;
            flag = flag*(-1);

        }

    }

    for (i = 0; i < outPutCol; i++)
    {
        for (j = 0; j < outPutRow; j++)
        {
            printf("%d   ", arrMatrix[i][j]);
        }

        printf("\n");
    }


}


※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
Scanner in = new Scanner(System.in);
        int x, y;
        System.out.print("행를 입력하세요 : ");
        x = in.nextInt();
        System.out.print("열을 입력하세요 : ");
        y = in.nextInt();

        int [][] Array= new int[x][y];

        int number = 0;
        int s = 1; // 형과 열의 증가, 감소 처리를 위한 변수
        int x_ = 0, y_ = -1;
        int xx = x, yy = y;

        try{
        while (number < xx * yy) {

            for (int i = 0; i < y; i++) {
                number++;
                y_ += s;
                Array[x_][y_] = number;
                System.out.println("y_ :" + y_ + " y :" + y);
            }
            System.out.println(number +"열 종료");
            x--;

            for (int j = 0; j < x; j++) {
                number++;
                x_ += s;
                Array[x_][y_] = number;
                System.out.println("x_ :" + x_ + " x :" + x);
            }
            System.out.println(number +"행 종료");
            y--;
            s *= -1;
        }
        }
        catch(Exception e){
            System.out.println(e.getMessage());
        }
        for (int i = 0; i < Array.length; i++) {
            for (int j = 0; j < Array[i].length; j++) {
                System.out.print(Array[i][j]+ "\t");
            }
            System.out.println("");
        }

겨우겨우 풀엇네요....ㅠ

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

※ 풀이작성 안내
  • 본문에 코드를 삽입할 경우 에디터 우측 상단의 "코드삽입" 버튼을 이용 해 주세요.
  • 마크다운 문법으로 본문을 작성 해 주세요.
  • 풀이를 읽는 사람들을 위하여 풀이에 대한 설명도 부탁드려요. (아이디어나 사용한 알고리즘 또는 참고한 자료등)
  • 작성한 풀이는 다른 사람(빨간띠 이상)에 의해서 내용이 개선될 수 있습니다.
목록으로
코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.


언어별 풀이 현황
전 체 x 123
java x 25
scala x 3
python x 40
delphi x 1
javascript x 1
cs x 5
기 타 x 11
go x 1
cpp x 30
lisp x 2
objectivec x 1
clojure x 1
ruby x 2