algorithm

[C++] 백준 알고리즘 1913번 (달팽이)

Dev:P 2019. 1. 20. 13:02
반응형

문제

 

 


이번에 다뤄볼 문제는 1913번 문제 '달팽이'입니다.

달팽이 문제에서 연습해야 하는 key-point는 2차원 배열과 이중포문입니다.

 

이번 문제는 아래 코드를 보며 같이 설명드리겠습니다.

rcheck = 0, ccheck = 0 // 왼쪽 끝, 위쪽 끝을 나타내기 위한 값입니다.

rlimit = 0. climit = 0 // 오른쪽 끝, 아래쪽 끝을 나타애기 위한 값입니다.

 

rlimit, climit의 경우 N값을 입력 받았을때 N-1값으로 대체시켜줍니다.

이후 for문을 돌며 4개의 분기문을 만들어줍니다.

2차원 배열을 (0,0)부터 채워나가기 시작 할 것이므로

N*N값부터 1씩 줄여가며 배열을 완성합니다.

 

N을 소인수분해 했을때 나타날 수 있는 인수중 가장 큰 값은 루트N입니다.

따라서, 2부터 루트N까지 for문을 돌면서 N을 나눌 수 있다면 계속 나눠주면 됩니다.

 

아래 해답 코드를 보면 더 쉽게 이해할 수 있으실 겁니다.


 

코드(C++)

#include<iostream>
using namespace std;

int main() {
    long arr[1000][1000];
    int n, m;
    int num;
    int rcheck = 0, ccheck = 0, rlimit=0, climit=0;
 
    cin >> n;
    cin >> m;
    num = n*n;
    rlimit = n - 1;
    climit = n - 1;
    for (int r=0, c=0, k = num; k >= 1; k--) {
        if (c < climit && r == rcheck) {
            arr[c++][r] = k;
        }
        else if (c == climit && r < rlimit) {
            arr[c][r++] = k;
        }
        else if (c > ccheck && r == rlimit) {
            arr[c--][r] = k;
        }
        else if (c == ccheck && r > rcheck) {
            arr[c][r--] = k;
            if (r == rcheck + 1) {
                rcheck++, ccheck++, rlimit--, climit--;
            }
        }
        else if (c == climit && c == ccheck) {
            arr[c][r] = k;
        }
    }
 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cout << arr[i][j] << ' ';
        }
        cout << endl;
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (arr[i][j] == m) {
                cout << i+1 << ' ' << j+1 << endl;
            }
        }
    }
    return 0;
}
 

 

 

반응형