Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 연산자 끼워넣기
- django
- 17144
- 구슬탈출2
- 14502
- 좋아요
- 17136
- 6603
- 부분수열의 합
- 17472
- 17143
- 인스타그램
- 9095
- 로또
- 괄호추가하기
- 재귀
- 인스타
- Java
- 색종이 붙이기
- 미세먼지 안녕!
- 1182
- 알고리즘
- 14888
- 댓글
- 따라하기
- 백준
- 장고
- 16637
- Ajax
- 다리 만들기2
Archives
- Today
- Total
Be a developer
백준 14503 로봇 청소기 본문
코딩 테스트 치러가기 전에 풀다가 2일 뒤인 오늘 마저 풀게 된 문제이다..
무슨 정신상태로 했는지 코드가 엉망진창이었다.
시뮬레이션 문제답게 조건만 맞춰주면 되는 문제이다.
다만 신경쓸 것은 방향이 주어지기 때문에 그에 맞춰서 dr, dc 배열을 선언해주면 편하다. 또한 dir을 바꿀 때 % 연산자를 통해서 쉽게 변경하는 것도 쉽게 문제를 푸는 방법이다. 자주 쓰이는 방법인 것 같다.
그리고 scanf로 계속 입력을 받았는데, cin과 cout을 좀 더 쓰도록 노력해야 겠다. 쓰는 방법을 잘 익히고 있어야 될 것 같다.
아래는 코드이다.
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 | #include <iostream> using namespace std; //북, 동, 남, 서 방향(idx) int dr[4] = { -1,0,1,0 }; int dc[4] = { 0,1,0,-1 }; int n, m, ans; //현재 청소기의 위치와 방향을 저장 int r, c, d; //0,0부터 시작하니까 50,50으로 잡아도 된다. int map[50][50]; bool visit[50][50]; int main(int argc, char** argv) { cin >> n >> m; cin >> r >> c >> d; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf("%d", &map[i][j]); } } while (1) { //방문하지 않았고, 벽이 아니라면 check(청소)한다. if (!visit[r][c] && map[r][c] != 1) { visit[r][c] = true; ans++; } int ok = false; //사방이 모두 갈 수 없는 곳임을 체크하기 위한 값이다. int cnt = 0; while (cnt != 4) { cnt++; //현재 방향의 왼쪽 방향으로 d를 바꿔준다. int nd = (d + 3) % 4; int nr = r + dr[nd]; int nc = c + dc[nd]; //왼쪽이 청소할 공간이 없다면 회전한다. if (nr < 0 || nr >= n || nc < 0 || nc >= m || map[nr][nc] == 1 || visit[nr][nc]) { d = nd; continue; } //왼쪽 방향이 벽이 아니고 청소할 수 있는 곳이면 전진한다. if (!visit[nr][nc] && map[nr][nc] != 1) { r = nr; c = nc; d = nd; //다시 청소 할 수 있도록 while 밖으로 나간다. ok = true; } if (ok)break; } //4방향이 모두 불가능 하면 한 칸 후진한다. if (!ok) { //반대 방향으로 가야한다. if (d == 0 || d == 1) { r = r + dr[d + 2]; c = c + dc[d + 2]; } else { r = r + dr[d - 2]; c = c + dc[d - 2]; } //후진 하려는 곳이 벽이면 종료 if (map[r][c] == 1)break; } /*출력(디버깅) printf("\n"); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { printf("%d ", visit[i][j]); } printf("\n"); } printf("\n"); */ } printf("%d\n", ans); return 0; } | cs |
'sw 역량테스트' 카테고리의 다른 글
백준 3190 뱀 (0) | 2019.04.24 |
---|---|
백준 14890 경사로 (0) | 2019.04.16 |
백준 14889 스타트와 링크 (0) | 2019.04.13 |
백준 14891 톱니바퀴 (0) | 2019.04.12 |
백준 15683 감시 (0) | 2019.04.12 |
Comments