반응형
문제
이번에 다뤄볼 문제는 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;
}
반응형
'algorithm' 카테고리의 다른 글
[C++] 백준 알고리즘 2178번 (미로 탐색) (0) | 2021.08.03 |
---|---|
[C++] 백준 알고리즘 1152번 (단어의 개수) (0) | 2019.01.20 |
[C++] 백준 알고리즘 10799번 (쇠막대기) (0) | 2019.01.20 |
[C++] 백준 알고리즘 9012번 (괄호) (0) | 2019.01.20 |
[C++] 백준 알고리즘 2581번 (소수) (0) | 2019.01.20 |