728x90
이차원 배열을 활용하여 구현하는 문제이다.
프로그래머스 월간 챌린지에서도 이런 비슷한게 나와서
연습겸 풀어보았다
- 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<int, int> 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 |