1913번 - 달팽이
내가 까다롭게 푼지는 모르겠는데, 처음에 약간 까다롭다고 느꼈다.
while 문에서 아래로 쭉, 오른쪽으로 쭉, 위로 쭉, 왼쪽 쭉, 아래로 쭉...
이런식으로 반복되기 때문에 dx,dy 배열을 만들어서 x,y 값을 이동시키면서 문제를 풀었다.
그리고 dx,dy 안에 들어갈 인덱스 d 값은 x나 y가 범위를 벗어나거나, 이미 수가 채워져 있으면 변화하도록 만들었다.
그리고 다 짜고 보니, k=0일때 한번 더 들어가는게 확인돼서, while문의 조건문에 추가해서 문제를 풀었다.
<정답 코드>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #include<iostream> #include<vector> using namespace std; int dx[4] = { 1,0,-1,0 }; int dy[4] = { 0,1,0,-1 }; int main() { int n, num; cin >> n >> num; vector<vector<int>> map(n, vector<int>(n,0)); int k = n*n +1; int ansx, ansy; int x = 0, y = 0; int d = 0; while (k-- && k!=0) { map[x][y] = k; if (k == num) { ansx = x; ansy = y; } int nx = x + dx[d]; int ny = y + dy[d]; if (nx >= n || ny >= n || nx < 0 || ny < 0 || map[nx][ny]!=0) { d++; if (d == 4) { d = 0; } } x = x + dx[d]; y = y + dy[d]; } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cout << map[i][j] << " "; } cout << "\n"; } cout << ansx+1 << " " << ansy+1 << "\n"; return 0; } | cs |
반응형