1952번 - 달팽이2
간단한 시뮬레이션인 줄 알았는데, 은근히 뭔가 안돼서 계속 고쳤다.
일단 처음에 메인 함수의 while 문에서 코드를 간결하게 하려고 해보았지만, x+dx[dir] 이 사용되는 곳에 따라 바뀌어야 하기 때문에
if 문에서 x+dx[dir], y+dy[dir] 부분과 if문 벗어나서 그 부분이 다르기 때문에 한번 다시 써줘야했다...최적화 안됨
그리고 범위가 벗어나는 경우를 처음에는 무조건 돌면서 가운데로 들어오기 때문에
map[x+1][y], map[x-1][y], map[x][y-1], map[x][y+1] 이 모두 1이 되는 지점에서 break를 걸어주면 된다고 생각했다.
하지만 생각해보니 1,1 , 3,1 처럼 방향 변화가 전혀 없을 수 있는 map 이 존재했기 때문에 그런걸 포함해서 check() 로 break 조건을 만들어
줬다.
<정답 코드>
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 49 50 51 52 | #include<iostream> using namespace std; int dx[4] = { 0,1,0,-1 }; int dy[4] = { 1,0,-1,0 }; int map[100][100] = { 0, }; int n, m, ans = 0, dir = 0; bool check(int x,int y) { for (int d = 0; d < 4; d++) { int nx = x + dx[d]; int ny = y + dy[d]; if (nx >= 0 && ny >= 0 && nx < n && ny < m && map[nx][ny] == 0) return false; } return true; } int main() { ios::sync_with_stdio(false); cin.tie(NULL); cin >> n >> m; int x = 0, y = 0; while (true) { map[x][y] = 1; if (check(x,y)) break; if (x+dx[dir] >= n || y+dy[dir] >= m || x+dx[dir] < 0 || y+dy[dir] < 0 || map[x+dx[dir]][y+dy[dir]] == 1) { dir = (dir + 1) % 4; ans++; } x += dx[dir], y += dy[dir]; } cout << ans << endl; return 0; } | cs |
반응형