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

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

27개의 풀이가 있습니다. 1 / 3 Page

#include <iostream>

using namespace std;
void getInput(int ** arr, int row, int column);

int main() {

    int row=0, column=0;

    cin >> row >> column;

    int ** arr = new int *[row];
    for(int i=0; i<row; i++) {
        arr[i] = new int [column];
    }

    getInput(arr, row, column);

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

    return 0;
}

void getInput(int ** arr, int row, int column) {
    int inputValue =-1;
    int start_i = 0, start_j = 0;
    int last_i = row-1, last_j = column-1;
    int finalValue = (row*column)-1;

    while(inputValue!=finalValue){
        for(int j=start_j; j<=last_j; j++) {
            inputValue+=1;
            arr[start_i][j] = inputValue;
        }
        if(inputValue==finalValue) break;
        for(int i=start_i+1; i<=last_i; i++) {
            inputValue+=1;
            arr[i][last_j] = inputValue;
        }
        if(inputValue==finalValue) break;
        for(int j=last_j-1; j>=start_j; j--) {
            inputValue+=1;
            arr[last_i][j] = inputValue;
        }
        if(inputValue==finalValue) break;
        for(int i=last_i-1; i>=start_i+1; i--) {
            inputValue+=1;
            arr[i][start_j] = inputValue;
        }
        if(inputValue==finalValue) break;
        start_i+=1; start_j+=1; last_i-=1; last_j-=1;
    }
}

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

int main(){
    int x=100, y=90, x_=0, y_=0; 
    // x, y : 사용자 입력(행,렬) 
    // x_,y_ 결과표시를 위한 임시저장 변수 
    int a=0, b=0, c=0, i=0, j=0;
    // a, b : 각각 행,열 좌표조정을 위한 변수
    // c : 테두리 직선의 count 수
    // i, j : 반복문을 위한 임시변수 

    int current = 0; // 대입할 값
    int **arr;

    scanf("%d %d", &x, &y);
    x_ = x;
    y_ = y;

    arr = (int**) malloc (sizeof(int*)*x);
    for(i=0; i<x; i++) arr[i]=(int*)malloc(sizeof(int)*y);

    // a, b의 증가또는 감소로 arr의 인덱스(좌표 a,b) 방향을 조절하고
    // 하나의 라인이 끝날 때마다 x_, y_ 값을 점점 줄여나가면서
    // 나선방향으로 차례대로 값을 대입한다.

    for(c=1; current<x*y; c++){
        int temp = (c/2)%2; 
        // temp : arr의 인덱스를 표시하는 a 또는 b의 증감(방향)을 판별하기위한 변수
        // 행의 경우 temp의 값이 1인경우 a가 증가하는방향, 아닌경우 감소하는 방향
        // 열의 경우 temp의 값이 0인경우 b가 증가하는방향, 아닌경우 감소하는 방향

        // 행, 열, 행, 열 순서대로 대입하므로 
        // 하나의 라인을 count하는 c가 홀수인경우 열, 짝수인경우 행
        if(c%2 == 1){ // 열
            for(i=0; i<y_; i++){
                if(i != 0){
                    if(temp == 0) b++;
                    else b--;
                }
                //printf("(%d, %d) = %d\n", a, b, current);
                arr[a][b] = current;
                current++;
            }
            y_--;
        }
        else{ // 행
            for(i=0; i<x_-1; i++){
                if(temp == 1) a++;
                else a--;
                //printf("(%d, %d) = %d\n", a, b, current);
                arr[a][b] = current;
                current++;
            }
            if(temp == 0) b++;
            else b--;
            x_--;
        }
    }

    for(i=0; i<x; i++){
        for(j=0; j<y; j++)
            printf("%d ", arr[i][j]);
        printf("\n");
    }

    return 0;
}

C언어로 작성. 풀이방법은 주석참고.

아..2차원 배열 동적 할당 방법에 대해서 새로이 배우네요.. 좋은 풀이 감사합니다~ - Jeon Jihyeon, 2016/10/04 00:26 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

안녕하세요. C로 짰는데 언어선택에 C가 없어서 C++로 선택했습니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* Given a 2-dimensional array, make it a spiral array.
 * Spiral array is like below.
 *  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
 *
 * array: pointer of 2-dimensional array
 * row: the number of rows
 * col: the number of columns
 * start: the start value which is the leftmost-top value of array
 */
void spiral_array(int **array, int row, int col, int start)
{
  int i;
  int idx = 0;
  int val = start;

  while (row > 0 && col > 0) {
    // left-top to right-top
    for (i = idx; i < idx + col; i++) {
      array[idx][i] = val++;
    }

    // right-top to right-bottom
    for (i = idx + 1; i < idx + row; i++) {
      array[i][idx + col - 1] = val++;
    }

    // right-bottom to left-bottom
    if (row > 1) {
      for (i = idx + col - 2; i >= idx; i--) {
        array[idx + row - 1][i] = val++;
      }
    }

    // left-bottom to left-top
    if (col > 1) {
      for (i = idx + row - 2; i > idx; i--) {
        array[i][idx] = val++;
      }
    }

    idx++;
    row -= 2;
    col -= 2;
  }
}

/* print matrix(2-dimensional array)
 * matrix: pointer of matrix
 * row: the number of rows
 * col: the number of columns
 * space: the minimum number of characters for a value to be printed */
void print_matrix(int **matrix, int row, int col, int space)
{
  int i, j;
  for (i = 0; i < row; i++) {
    for (j = 0; j < col; j++) {
      printf("%*d ", space, matrix[i][j]);
    }
    printf("\n");
  }
}

int **malloc_2d(int row, int col)
{
  int i;
  int **p = (int **)malloc(sizeof (int *) * row);
  if (p == NULL) return NULL;

  for (i = 0; i < row; i++) {
    p[i] = (int *)malloc(sizeof (int) * col);

    if (p[i] == NULL) {
      int j;
      for (j = 0; j < i; j++)
        free(p[j]);
      free(p);
      return NULL;
    }
  }

  return p;
}

void free_2d(int **p, int row)
{
  int i;
  for (i = 0; i < row; i++)
    free(p[i]);
  free(p);
}

int main(int argc, char *argv[])
{
  int row, col;
  printf("row: ");
  scanf("%d", &row);
  printf("col: ");
  scanf("%d", &col);
  int **mat = malloc_2d(row, col);
  spiral_array(mat, row, col, 0);
  print_matrix(mat, row, col, 2);
  free_2d(mat, row);
  return 0;
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

이제 2번째 문제네요!! 프로그래밍을 배우고있는 고등학교 2학년입니다! 게임만들듯이 짜봤어요 ㅋㅋ 조금 노가다네요

//
//  main.cpp
//  CodingDojang_2
//
//  Created by 최세현 on 2014. 9. 2..
//  Copyright (c) 2014년 worldbright. All rights reserved.
//

#include <iostream>

using namespace std;

int startx, starty, endx, endy;
int width, height;
int x, y;
int direction;
int **spiralArray;

void input()
{
    cout<<"넓이 : ";  cin>>width;
    cout<<"높이 : ";  cin>>height;
    endx = width;
    endy = height;
}

void init()
{
    spiralArray = new int*[height];
    for(int i = 0; i < width; i++) {
        spiralArray[i] = new int[width];
    }

    startx = 0; starty = 1;
    x = y = direction = 0;
}

void update()
{
    for(int i = 1; i <= width*height; i++) {
        spiralArray[y][x] = i;
        switch (direction%4) {
            case 0:
                x++;
                if(x == endx-1) {
                    direction++;
                    endx--;
                }
                break;
            case 1:
                y++;
                if(y == endy-1) {
                    direction++;
                    endy--;
                }
                break;
            case 2:
                x--;
                if(x == startx) {
                    startx++;
                    direction++;
                }
                break;
            case 3:
                y--;
                if(y == starty) {
                    starty++;
                    direction++;
                }
                break;
        }
    }
}

void result()
{
    for(int i = 0; i < width; i++) {
        for(int j = 0; j < height; j++) {
            cout<<spiralArray[i][j]<<"\t";
        }
        cout<<endl;
    }
}

int main(int argc, const char * argv[])
{
    input();
    init();
    update();
    result();

    return 0;
}

결과

넓이 : 6
높이 : 5
1   2   3   4   5   6   
18  19  20  21  22  7   
17  28  29  30  23  8   
16  27  26  25  24  9   
15  14  13  12  11  10  
Program ended with exit code: 0

나중에 알고리즘 능력이 뛰어나지면 다시한번 조금 더 간결한 코드로 풀어봐야겠네요

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

//C++이 아니라 C로 짰어요.

#include <stdio.h>
#include <stdlib.h>

void spiral(int **param, int m, int n);
int main()
{
    int rows, cols;
    int num = 0;
    scanf("%d %d", &rows, &cols);

    int **arr = (int**)malloc(sizeof(int*)*rows); //2차원배열 동적할당
    for (int i = 0; i < rows; i++){
        arr[i] = (int*)malloc(sizeof(int)*cols);
    }
    printf("arr에 값 할당------------\n\n");
    spiral(arr, rows, cols);
    for (int i = 0; i < rows; i++){
        for (int j = 0; j < cols; j++){
            printf("%4d", arr[i][j]);
        }
        printf("\n");
    }

    printf("\n----------------------------------\n");
    for (int i = 0; i < rows; i++){ //2차원배열 메모리 해제
        free(arr[i]);
    }
    free(arr);

    return 0;
}

void spiral(int **param, int m, int n)
{
    int rLimit = m-1, cLimit = n-1;
    int rUnderline = 0, cUnderline = 0;
    int num, i, j;
    for (num = 0, i = 0, j = 0; num < m*n; num++){
        if (j < cLimit && i == rUnderline){
                param[i][j++] = num;
        }
        else if (j == cLimit && i < rLimit){
            param[i++][j] = num;
        }
        else if (j > cUnderline && i == rLimit ){
            param[i][j--] = num;
        }
        else if (j == cUnderline && i > rUnderline){
            param[i--][j] = num;
            if (i == rUnderline + 1)
                rLimit--, cLimit--, rUnderline++, cUnderline++;
        }
    }
    if (m % 2){   //2n-1 * 2n-1경우 또는 2n-1 * 2n-2(앞 홀수보다 1작은수)일 경우 가운데 하나가 비는 것을 방지
        if (n % 2) param[m/2][n/2] = m*n-1;
        else param[m / 2][n/2-1] = m*n-1;
    }
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

C++로 최대한 간단하게 만들어봤습니다 :) 임시 저장 공간 없이 만드는 건 도저히 못 할 것 같네요. Left, right, top, bottom 변수를 둬서 해결했습니다. 코드 짧게 만드는데 약간의 삽질이 필요했습니다.

#include <iostream>
#include <iomanip>

void printSpiralMatrix(size_t row, size_t col) {
  using namespace std;
  int *A = new int[row * col];

  for (int val = 0, l = 0, r = col - 1, t = 0, b = row - 1;
    l <= r && t <= b; ++l, --r, ++t, --b) {
    for (int i = l; i <= r; ++i)
      A[t * row + i] = val++;
    for (int i = t + 1; i <= b - 1; ++i)
      A[i * row + r] = val++;
    for (int i = r; t < b && i >= l; --i)
      A[b * row + i] = val++;
    for (int i = b - 1; l < r && i >= t + 1; --i)
      A[i * row + l] = val++;
  }

  for (size_t r = 0; r < row; ++r) {
    for (size_t c = 0; c < col; ++c) {
      cout << setw(3) << A[r * row + c];
    }
    cout << endl;
  }

  delete[] A;
}


int main() {
  printSpiralMatrix(6, 6);
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
/*
문제는 다음과 같다:
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 매트릭스에 나선형 회전을 한 값을 출력해야 한다.

row가 n이면
n-1개씩 숫자를 묶으면 4개씩 끊긴다..
그 다음은 n-2개씩 묶이고...
(정사각형만 적용됨)
*/
#include<stdio.h>
#include<stdlib.h>

int main(void)
{
    int row=0;
    int col=0;
    int ** arr;
    int i=0;
    int j=0;
    int cnt=0;
    int forcnt=0;
    int loop=0;
    int set=0;

    printf("row와 col 입력: ");
    scanf("%d %d",&row,&col);

    arr = (int**)malloc(sizeof(int*)*row);
    for(i=0;i<row;i+=1)
    {
        arr[i] = (int*)malloc(col*sizeof(int));
    }

    set = row-1;
    while(set>0)
    {
        for(j=loop;j<col-1-loop;j+=1)
        {
                arr[loop][j] = cnt;
                cnt+=1;
        }
        // j==4 status
        //forcnt+=1;
        for(i=loop;i<row-1-loop;i+=1)
        {
            arr[i][j] = cnt;
            cnt+=1;
        }//forcnt+=1;
        // i==4 , j==4 status
        for(j=row-1-loop;j>loop;j-=1)
        {
            arr[i][j] = cnt;
            cnt+=1;
        }//forcnt+=1;
        // i==4 j==0 stat
        for(i=row-1-loop;i>loop;i-=1)
        {
            arr[i][j] = cnt;
            cnt+=1;
        }//forcnt+=1;
        //i==0 j==0 stat
        loop+=1;
        set -= 2;
    }       

    if(row % 2 == 1)
    {
        arr[row/2][col/2] = row*col-1;
    }
    for(i=0;i<row;i+=1)
    {
        for(j=0;j<col;j+=1)
        {
            printf("%3d",arr[i][j]);
        }
        printf("\n");
    }
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

void exce2()
{
    int x, y;
    int posX = -1, posY = 0;
    int **mat;

    const int left = 1, right = 2, up = 3, down = 4;
    int direc = right;

    printf("input x : ");
    scanf_s("%d", &x);
    printf("input y : ");
    scanf_s("%d", &y);

    mat = (int **)malloc(sizeof(int) * y);

    for (int i = 0; i < y; i++)
    {
        mat[i] = (int *)malloc(sizeof(int) * x);
        for (int j = 0; j < x; j++)
            mat[i][j] = -1;
    }

    for (int i = 0; i < (x*y); i++)
    {
        switch (direc)
        {
        case right:
            posX++;
            if (posX == x - 1 || mat[posY][posX + 1] != -1)
                direc = down;
            break;
        case down:
            posY++;
            if (posY == y - 1 || mat[posY+1][posX] != -1)
                direc = left;
            break;
        case left:
            posX--;
            if (posX == 0 || mat[posY][posX - 1] != -1)
                direc = up;
            break;
        case up:
            posY--;
            if (posY == 0 || mat[posY-1][posX] != -1)
                direc = right;
            break;
        }

        mat[posY][posX] = i;
    }

    for (int i = 0; i < y; i++)
    {
        for (int j = 0; j < x; j++)
        {

            printf("%3d ", mat[i][j]);
        }
        printf("\n");
    }
}

매트릭스에 미리 나선형으로 넣어두고 출력하는 방식을 사용하였습니다.

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

int _tmain(int argc, _TCHAR* argv[])
{
    int x = 5;
    int y = 6;

    int** pMap = new int*[x];

    for (int i = 0; i < x; ++i)
        pMap[i] = new int[y];

    for (int i = 0; i < x; ++i)
    {
        for (int j = 0; j < y; ++j)
            pMap[i][j] = 0;
    }
    /////////////////////////////////////

    int nPos_i = 0;
    int nPos_j = 0;

    int nNum = 1;
    int nCount = 0;

    while (nNum != x * y + 1 )
    {
        int nRemain = nCount%4;
        nCount++;

        switch (nRemain)
        {
        case 0:
            for (int i = 0; i < x;)
            {
                if (pMap[nPos_i][nPos_j] == 0)
                {
                    pMap[nPos_i][nPos_j] = nNum++;

                    if (nPos_i + 1 == x)
                        break;
                    if (pMap[nPos_i + 1][nPos_j] == 0)
                        nPos_i++;
                    else
                        break;
                }
                else
                    nPos_i++;
            }
            break;
        case 1:
            for (int i = 0; i < y;)
            {
                if (pMap[nPos_i][nPos_j] == 0)
                {
                    pMap[nPos_i][nPos_j] = nNum++;

                    if (nPos_j + 1 == y)
                        break;
                    if (pMap[nPos_i][nPos_j + 1] == 0)
                        nPos_j++;
                    else
                        break;
                }
                else
                    nPos_j++;                    
            }
            break;
        case 2:
            for (int i = 0; i < x;)
            {
                if (pMap[nPos_i][nPos_j] == 0)
                {
                    pMap[nPos_i][nPos_j] = nNum++;

                    if (nPos_i == 0)
                        break;
                    if (pMap[nPos_i - 1][nPos_j] == 0)
                        nPos_i--;
                    else
                        break;
                }
                else
                    nPos_i--;
            }
            break;
        case 3:
            for (int i = 0; i < y;)
            {
                if (pMap[nPos_i][nPos_j] == 0)
                {
                    pMap[nPos_i][nPos_j] = nNum++;

                    if (nPos_j == 0)
                        break;
                    if (pMap[nPos_i][nPos_j - 1] == 0)
                        nPos_j--;
                    else
                        break;
                }
                else
                    nPos_j--;
            }
            break;
        default:
            assert(0);
            break;
        }
    }

    for (int i = 0; i < y; ++i)
    {
        for (int j = 0; j < x; ++j)
            printf("%3d", pMap[j][i]);
        printf("\n");
    }

    /////////////////////////////////////
    for (int i = 0; i < x; ++i)
        delete [] pMap[i];

    delete [] pMap;

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

using namespace std;




int main()
{
    int width = 1, height = 1;

    // 맵 초기화
    cin >> width >> height;

    std::vector<std::vector<int>> map;

    for (int x = 0; x < width; ++x)
    {
        map.emplace_back();

        for (int y = 0; y < height; ++y)
        {
            map[x].push_back(0);
        }
    }


    // 숫자 삽입
    int num = 0;
    int endNum = width*height;

    int currX = 0, currY = 0;
    int currWidth = width, currHeight = height;

    while (num < endNum)
    {
        map[currX][currY] = num;

        while (num < endNum - 1 && currX < currWidth - 1)
        {
            ++currX;
            ++num;
            map[currX][currY] = num;
        }

        while (num < endNum - 1 && currY < currHeight - 1)
        {
            ++currY;
            ++num;
            map[currX][currY] = num;
        }

        while (num < endNum - 1 && currX > width - currWidth)
        {
            --currX;
            ++num;
            map[currX][currY] = num;
        }

        --currHeight;

        while (num < endNum - 1 && currY > height - currHeight)
        {
            --currY;
            ++num;
            map[currX][currY] = num;
        }

        ++currX;

        --currWidth;

        ++num;
    }


    // 출력
    for (int y = 0; y < height; ++y)
    {
        for (int x = 0; x < width; ++x)
        {
            cout.width(4);
            cout << map[x][y];
        }

        cout << endl << endl;
    }


    return 0;
}

개판...ㅠ

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

풀이 작성

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

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


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