PS

BOJ 1913 - 달팽이

728x90

www.acmicpc.net/problem/1913

 

1913번: 달팽이

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

www.acmicpc.net

 

이차원 배열을 활용하여 구현하는 문제이다.

프로그래머스 월간 챌린지에서도 이런 비슷한게 나와서

연습겸 풀어보았다

 

- c++

#include <iostream>
#define MAX 1000
 
using namespace std;
 
int N, pos;
long adj[MAX][MAX];
 
void print_adj() {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            cout << adj[i][j] << " ";
        }
        cout << '\n';
    }
}
 
pair<intint> find_pos(int pos) {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (adj[i][j] == pos) {
                return make_pair(i + 1, j + 1);
            }
        }
    }
}
 
void make_snail(int N) {
    int left_limit = 0, top_limit = 0;              // 좌, 상 한계점
    int right_limit = N - 1, bottom_limit = N - 1;  // 우, 하 한계점
    for (int row = 0, col = 0, cnt = N * N; cnt >= 1; cnt--) {
        if (row < bottom_limit && col == left_limit) {
            // 아래로 이동 (N = 3 일때, row 는 0, 1 에 값 넣고 2 일때 다음 if 로 넘어감)
            adj[row++][col] = cnt;
        } else if (col < right_limit && row == bottom_limit) {
            // 오른쪽 이동 (N = 3 일때, col 은 0, 1 에 값 넣고 2 일때 다음 if 로 넘어감)
            adj[row][col++= cnt;
        } else if (row > top_limit && col == right_limit) {
            // 위로 이동 (N = 3 일때, row = 2, col = 2 에서 처음 시작하고, row = 0, col = 2 에서 다음 if 로 넘어감 이때 4까지 채움)
            adj[row--][col] = cnt;
        } else if (col > left_limit && row == top_limit) {
            // 좌측으로 이동
            adj[row][col--= cnt;
            if (col == left_limit + 1) {
                left_limit++, top_limit++, right_limit--, bottom_limit--;  // 왼쪽 과 위쪽 에 대한 리미트를 하나 늘리고 오른쪽과 아래에 대한 리미트를 하나 줄인다 그래서 전체적인 크기를 하나 줄일수 있음
            }
        } else if (row == top_limit && row == bottom_limit) {
            // 위와 아래의 리미트가 같으면 마지막 1 값이 들어가는 지점.
            adj[row][col] = cnt;
        }
    }
}
 
int main() {
    cin.tie(0);
    ios_base::sync_with_stdio(0);
    cin >> N;
    cin >> pos;
    make_snail(N);
    print_adj();
    cout << find_pos(pos).first << " " << find_pos(pos).second;
    return 0;
}
cs

 

 

728x90

'PS' 카테고리의 다른 글

BOJ 1929 - 소수 구하기  (0) 2020.09.30
BOJ 2512 - 예산  (0) 2020.09.28
BOJ 1504 - 특정한 최단 경로  (0) 2020.09.17
BOJ 11585 - 속타는 저녁 메뉴  (0) 2020.09.14
BOJ 7569 - 토마토  (0) 2020.09.06