본문 바로가기

Algorithm/Implementation

(C++) - 백준(BOJ) 1913번 : 달팽이

반응형

www.acmicpc.net/problem/1913

 

1913번: 달팽이

N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서

www.acmicpc.net

구현문제였습니다.

 

풀이방법

 1. (n/2, n/2) = 1로 시작합니다.

 

 2. cnt가 n*n될때까지 cnt를 1씩 증가시켜주면서 방향을 전환해줍니다. 한 변을 채운다는 느낌으로 선언한 a배열에 cnt를 저장해주시면됩니다. 한 변을 채우고 나면 dir변수를 바꿔서 방향을 전환해줍니다.

 

Code

#include <iostream>
using namespace std;
int n, x, y, dir, findNum, cnt = 1, piv = 1;
int a[1001][1001];

void print(){
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++)
            cout << a[i][j] << ' ';
        cout << '\n';
    }
}

int main(){
    cin >> n >> findNum;
    x = n/2;
    y = n/2;
    a[x][y] = 1;
    while(cnt < n*n){
        if(dir == 0){
            for(int k = 0; k < piv; k++){ 
                a[--x][y] = ++cnt;
                if(cnt == n*n) break;
            }
        }
        else if(dir == 1){
            for(int k = 0; k < piv; k++) a[x][++y] = ++cnt;
            piv++;
        }
        else if(dir == 2){
            for(int k = 0; k < piv; k++) a[++x][y] = ++cnt;
        }
        else if(dir == 3){
            for(int k = 0; k < piv; k++)
                a[x][--y] = ++cnt;
            piv++;
        }
        dir = (dir+1)%4;
    }
    
    print();

    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            if(a[i][j] == findNum) {
                cout << i + 1 << ' ' << j + 1;
                break;
            }
        }
    }
}