본문 바로가기
알고리즘/문제풀이

[백준/C++] #1913 달팽이 (Simulation)

by persi0815 2024. 8. 5.

문제

https://www.acmicpc.net/problem/1913

 

 

구상

나는 보통 문제에 명시되어있는 조건들을 이용해서 풀이를 찾는 편이다. 입력 조건이 홀수인 자연수 N이라고 나와있었고, 도출해야 하는 최종 배열의 (0,0) 값이 항상 홀수인 자연수의 제곱이 되는 수였다. 그래서 아래 사진과 같이 한겹 한겹 따로 계산해주는 방식을 택했다. 그리고, 상단, 우측, 하단, 좌측 순서로 몇개씩 배열에 넣으면 될까 그림을 그려봤는데, 2 -> 4 -> 6 -> .. 이런식으로 규칙이 명확해서 더 쉽고 빠르게 풀어낼 수 있었다. 

 

시뮬레이션에서는 다시금 첫값, 끝값이 중요하다는 것을 깨달았다.  

 

풀이 + 코드

#include<iostream>
#include<vector>
#include<algorithm>
#include<climits>
#include<queue>
#define MAX 101
#define INF 987654321
#define endl "\n"
using namespace std;
/*
1913 달팽이
달팽이 길 만들고, 좌표 출력
*/

int N; // 홀수인 자연수 N
int res;
vector<vector<int>> map;

void solution() {
    // map 만들기
    int num = 1;
    map[(N+1)/2-1][(N + 1) / 2 - 1] = 1;
    int n = 1;
    int r = (N + 1) / 2 - 1; int c = (N + 1) / 2 - 1;

    r--; // 한칸 올라가서 시작

    for (int i = 0; i < (N + 1) / 2 - 1; i++) { // 껍질 개수만큼

        // 상단
        for (int j = 0; j < num *2; j++) {
            map[r][c++] = ++n;
        }

        // 오른쪽
        c--;
        r++;
        for (int j = 0; j < num * 2; j++) {
            map[r++][c] = ++n;

        }
        // 하단
        r--;
        c--;
        for (int j = 0; j < num * 2; j++) {
            map[r][c--] = ++n;

        }
         // 왼쪽
        c++;
        r--;
        for (int j = 0; j < num * 2; j++) {
            map[r--][c] = ++n;
        }

        
        num++;
    }
}

int main() {
    ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    // 입력
    cin >> N >> res;
    map.resize(N, vector<int>(N));
    
    // 로직
    solution();

    // 출력
    int rr = 0; int cc = 0;

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (map[i][j] == res) {
                rr = i; cc = j;
            }
            cout << map[i][j] << " ";
        }
        cout << endl;
    }
    cout << rr+1 << " " << cc+1;

    return 0;

}