2017년도 상반기 석사 3학기 때 연습 삼아 DS SW직군에 지원했을 때, 풀었던 문제이다.
당시 C만 알던 시기였던 당시 if else 로만 주구장창 코딩했던 기억이 있다. 그때랑 문제가 좀 다른 것 같긴한데...단순 시뮬레이션이다.
우선 해당 자리를 청소해주고, 왼쪽을 살핀다. 왼쪽이 청소 가능하면 이동하고, 청소가 불가능하면 방향만 왼쪽으로 틀어준다.
그리고!!상하좌우 청소가 불가능하면 지금 방향에서 뒤로 한 칸 물러나면 끝~
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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | #include <stdio.h> #include <string.h> int map[50][50]; int N, M, R, C, D, Count;//D : 0 북, 1 동, 2 남, 3 서 int Back() { int r = R, c = C; switch (D) { case 0: r++; break; case 1: c--; break; case 2: r--; break; case 3: c++; break; } if (map[r][c] != 1) { R = r; C = c; return 1; } return 0; } int Check() { int r = R, c = C; switch (D) { case 0: c--; break; case 1: r--; break; case 2: c++; break; case 3: r++; break; } if (D == 0) D = 3; else D--; if (map[r][c] == 0) { R = r; C = c; return 1; } return 0; } int main() { scanf("%d %d", &N, &M); scanf("%d %d %d", &R, &C, &D); for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { scanf("%d",&map[i][j]); } } int Command = 1; while (1) { switch (Command) { case 1://현재 위치를 청소한다. Count++; map[R][C] = 2; Command = 2; break; case 2://왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 해당 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행. for (int i = 0; i < 4; i++) { if (Check()) { Command = 1; break; } if (i == 3)//네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유지한 채로 한 칸 후진 후 왼 쪽부터 다시 탐색 진행 { if (Back()) { Command = 2; break; } else { printf("%d\n",Count); return 0; } } } break; } } return 0; } | cs |
'SW 업무 관련 > 백준' 카테고리의 다른 글
[C언어] 14502. 연구소(DFS) (0) | 2018.09.23 |
---|---|
[C언어]14502. 연구소 (0) | 2018.09.17 |
[C언어]2573. 빙산 (0) | 2018.09.16 |
[C언어] 2015 오목. (0) | 2018.08.21 |
[C언어] 7562. 나이트의 이동 (0) | 2018.08.14 |