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 매트릭스에 나선형 회전을 한 값을 출력해야 한다.

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

154개의 풀이가 있습니다. 12 / 16 Page

좀 다른 방식으로 풀어봄

        public static int[,] GetSpiralMat(int rSize) {
            int matSize = rSize * rSize;
            int[,] mat = new int[rSize, rSize];

            //Surface position index by Level
            Func<int, int, List<Tuple<int, int>>> surfacePos = (k, lvl) => {
                int suf2 = k - 1;
                int suf3 = k - 2;
                List<Tuple<int, int>> positions = new List<Tuple<int, int>>();
                if (suf2 > 0) {
                    foreach (int v in Enumerable.Range(0, k))
                        positions.Add(new Tuple<int, int>(lvl, lvl + v));
                    foreach (int v in Enumerable.Range(1, suf2))
                        positions.Add(new Tuple<int, int>(v + lvl, suf2 + lvl));
                    foreach (int v in Enumerable.Range(1, suf2))
                        positions.Add(new Tuple<int, int>(suf2 + lvl, (suf2 + lvl) - v));
                    foreach (int v in Enumerable.Range(0, suf3))
                        positions.Add(new Tuple<int, int>((suf3 + lvl) - v, lvl));
                }
                else if (suf2 == 0) positions.Add(new Tuple<int, int>(lvl, lvl));
                return positions;
            };

            //Surface position Aggregation
            List<Tuple<int, int>> matPos = new List<Tuple<int, int>>();
            int slvl = 0;
            for (int i = rSize; i >= 0; i -= 2) {
                matPos.AddRange(surfacePos(i, slvl));
                slvl++;
            }

            //Map number sequence to position
            Enumerable.Range(0, matSize).ToList().ForEach(k => mat[matPos[k].Item1, matPos[k].Item2] = k);
            return mat;
        }

            int[,] mat = GetSpiralMat(9);
            for (int r = 0; r < mat.GetLength(0); r++) {
                for (int c = 0; c < mat.GetLength(1); c++) {
                    Console.Write($"{mat[r, c]:r3} ");
                }
                Console.Write('\n');
            }
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
x,y = input().split(' ')
x = int(x)
y = int(y)

list_ = [[[] for i in range(x)] for i in range(y)] # 기본 틀 생성       

count = 0  # 넣어야하는 숫자를 카운트해주는 변수
a_wall = 0
b_wall = x-1
c_wall = y-1
d_wall = 0

### 각 a,b,c,d 벽           a_wall
###                  ____________________
###                 |                    |
###         d_wall  |                    |  b_wall
###                 |____________________|
###                         c_wall

while (a_wall <= c_wall or b_wall >= d_wall) and count != x*y:

    for i in range(d_wall, b_wall):
        if count == x*y: break
        list_[d_wall][i] = count
        count += 1
    # a_wall 라인으로 가다 b_wall을 만날대까지 내려가며 숫자 채움

    for i in range(a_wall, c_wall):
        if count == x*y: break
        list_[i][b_wall] = count
        count += 1
    # b_wall 라인으로 가다 c_wall을 만날대까지 내려가며 숫자 채움

    for i in range(b_wall,d_wall,-1):
        if count == x*y: break
        list_[c_wall][i] = count
        count += 1
    # c_wall 라인으로 가다 d_wall을 만날대까지 내려가며 숫자 채움

    for i in range(c_wall,a_wall,-1):
        if count == x*y: break
        list_[i][d_wall] = count
        count += 1
    # d_wall 라인으로 가다 a_wall을 만날대까지 내려가며 숫자 채움

    if a_wall == b_wall == c_wall == d_wall:
        list_[d_wall][b_wall] = count
    # 이 코드는 (5 5) 형식의 배열의경우 마지막 한자리를 채우기위한 코드.

    a_wall += 1
    b_wall -= 1
    c_wall -= 1
    d_wall += 1
    # 각벽을 중앙을 기준으로 한칸씩 모아줌.

space = 5
for row in range(y):
    for col in range(x):            #↓보기좋게 출력하고싶어서..
        print(list_[row][col],' '*(space-len(str(list_[row][col]))), end='')
    print()
    # 출력

#### 2016.11.30 D-449 ####

좀 더 잘하고싶은데 아직 많이 미숙합니다. ㅎ
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

include

include

int main() { int i, j, x, y, N = 0, type = 0; printf("X : "); scanf("%d", &x); printf("Y : "); scanf("%d", &y); int arr; arr = (int)malloc(sizeof(int)y); arr[0] = (int)malloc(sizeof(int)xy); for(i = 1; i < y; i++) { arr[i] = arr[i-1] + x; } for (i = 0; i < y; i++) { for (j = 0; j < x; j++) { arr[i][j] = -1; } } i = 0, j = 0; while (N < xy) { if ((i<0) || (i>=y) || (j<0) || (j>=x) || (arr[i][j] != -1)) { switch (type) { case 0: j--; i++; break; case 1: i--; j--; break; case 2: j++; i--; break; case 3: i++; j++; break; } type = (type+1)%4; } arr[i][j] = N++; switch (type) { case 0: j++; break; case 1: i++; break; case 2: j--; break; case 3: i--; break; } } for (i = 0; i < y; i++) { for (j = 0; j < x; j++) { printf("%3d ", arr[i][j]); } printf("\n"); } free(arr[0]); free(arr); return 0; }

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

using namespace std;

const int MAX = 100;

int dx[] = { 1, 0, -1, 0 };
int dy[] = { 0, 1, 0, -1 };

int main()
{

    int m, n;
    int matrix[MAX][MAX];

    cin >> m >> n;

    for (int i = 0; i < m; ++i)
        for (int j = 0; j < n; ++j)
            matrix[i][j] = 0;

    int count = m * n;
    int dir = 0, x = 0, y = 0;

    for (int i = 1; i <= count; ++i)
    {
        matrix[y][x] = i;

        if (x + dx[dir] < 0 || x + dx[dir] >= n || y + dy[dir] < 0 || y + dy[dir] >= m
            || matrix[y + dy[dir]][x + dx[dir]] != 0)   // 기존의 방향으로 배열을 못채울 경우
            dir++;                      // 방향 변경
        dir %= 4;

        x += dx[dir];
        y += dy[dir];
    }

    for (int i = 0; i < m; ++i)
    {
        for (int j = 0; j < n; ++j)
            cout << matrix[i][j] << " ";
        cout << endl;
    }

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

한 바퀴 도는 것을 한 사이클이라고 생각해서 함수로 짜서 while문을 돌렸습니다. 생각보다 푸는데 시간이 좀 걸리네요 ㅠㅠ 아직 한참 부족하다는 것을 느낍니다.

#include <iostream>

// value in the matrix element
int value = 1;

// fill the matrix
void fill(int** matrix, int s_col, int s_row, int e_col, int e_row);
// print the matrix
void printMatrix(int** matrix, int row, int col);


int main(void)
{
    using std::cin;
    int row, col;
    // get the row and col dimension
    cin >> row >> col;
    // allocate matrix
    int** matrix = new int* [row];

    for(int i = 0; i < row; i++)
        matrix[i] = new int[col];

    int s_row = 0;
    int s_col = 0;
    int e_row = row - 1;
    int e_col = col - 1;

    while(e_row - s_row >= 0 && e_col - s_col >= 0)
    {
        fill(matrix, s_col, s_row, e_col, e_row);
        s_col++;
        s_row++;
        e_col--;
        e_row--;
    }

    printMatrix(matrix, row, col);

    // free matrix
    for(int i = 0; i < row; i++)
        delete[] matrix[i];

    delete[] matrix;
}

void fill(int** matrix, int s_col, int s_row, int e_col, int e_row)
{
    // copy the starting point
    int row = s_row;
    int col = s_col;

    while(col <= e_col) matrix[row][col++] = value++;

    col--;
    row++;

    // col 방향으로 한 줄만 채우면 완성인 경우 return
    if(s_row == e_row)
        return;
    else
    {
        while(row <= e_row) matrix[row++][col] = value++;

        row--;
        col--;
    }

    // row 방향으로 한 줄만 채우면 완성인 경우 return
    if(s_col == e_col)
        return;
    else
    {
        while(col >= s_col) matrix[row][col--] = value++;

        col++;
        row--;
    }

    while(row > s_row) matrix[row--][col] = value++;
}

void printMatrix(int** matrix, int row, int col)
{
    using std::cout;
    using std::endl;

    for(int i = 0; i < row; i++)
    {
        for(int j = 0; j < col; j++)
            cout << matrix[i][j] << "\t";

        cout << endl;
    }
}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
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("");
        }

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

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#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");
    }


}


※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
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 ""

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

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
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;

    }

}

자바로 작성했습니다.

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

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

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("");
        }
    }
}

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

풀이 작성

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

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


언어별 풀이 현황
전 체 x 154
기 타 x 19
java x 32
cpp x 35
python x 48
lisp x 2
ruby x 2
cs x 6
scala x 3
clojure x 1
objectivec x 2
go x 1
delphi x 1
javascript x 2