[백준 14503번 C/C++] 로봇 청소기
[백준 14503번 C/C++] 로봇 청소기

https://www.acmicpc.net/problem/14503
해결전략
구현
정답코드
#include <iostream> #include <vector> using namespace std; int dirY[4] = { -1, 0, 1, 0 }; int dirX[4] = { 0, 1, 0, -1 }; int n, m; int currY, currX, currDir; vector<vector<int>> v; int answer; // 청소하는 칸의 개수 bool Move(int y, int x, int dir) { // 4 방향 체크 for (int i = 0; i < 4; i++) { int nextDir = (dir + 3 - i) % 4; // 왼쪽으로 돌기 int ny = y + dirY[nextDir]; int nx = x + dirX[nextDir]; if (ny < 0 || n <= ny || nx < 0 || m <= nx) continue; if (v[ny][nx] == 0){ v[ny][nx] = -1; answer++; currY = ny, currX = nx, currDir = nextDir; return true; } } // 후진 if (dir == 0 && y + 1 < n && v[y + 1][x] != 1){ currY = y + 1, currX = x, currDir = dir; return true; } else if (dir == 1 && 0 <= x - 1 && v[y][x - 1] != 1){ currY = y, currX = x - 1, currDir = dir; return true; } else if (dir == 2 && 0 <= y - 1 && v[y - 1][x] != 1){ currY = y - 1, currX = x, currDir = dir; return true; } else if (dir == 3 && x + 1 < m && v[y][x + 1] != 1){ currY = y, currX = x + 1, currDir = dir; return true; } return false; } void Clean(int y, int x, int dir) { //cout << y << ", " << x << ", dir = " << dir << "\n"; if (Move(y, x, dir)){ Clean(currY, currX, currDir); } } int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> m; v.resize(n, vector<int>(m)); cin >> currY >> currX >> currDir; for (int y = 0; y < n; y++){ for (int x = 0; x < m; x++) { cin >> v[y][x]; } } // 시작 칸이 아직 청소되지 않은 경우, 시작 칸을 청소 if (v[currY][currX] == 0) { v[currY][currX] = -1; answer++; } Clean(currY, currX, currDir); cout << answer; return 0; }
해결전략
처음 실수한 부분
for (int i = dir; i < dir + 4; i++){ int ny = y + dirY[i % 4]; int nx = x + dirX[i % 4]; if (ny < 0 || n <= ny || nx < 0 || m <= nx) continue; if (v[ny][nx] == 0){ v[ny][nx] = -1; answer++; currY = ny, currX = nx, currDir = (i % 4); return true; } }
고친 코드
for (int i = 0; i < 4; i++) { int nextDir = (dir + 3 - i) % 4; // 왼쪽으로 돌기 int ny = y + dirY[nextDir]; int nx = x + dirX[nextDir]; if (ny < 0 || n <= ny || nx < 0 || m <= nx) continue; if (v[ny][nx] == 0){ v[ny][nx] = -1; answer++; currY = ny, currX = nx, currDir = nextDir; return true; } }
Ver.1
if (dir == 0 && y + 1 < n && v[y + 1][x] != 1){ currY = y + 1, currX = x, currDir = dir; return true; } else if (dir == 1 && 0 <= x - 1 && v[y][x - 1] != 1){ currY = y, currX = x - 1, currDir = dir; return true; } else if (dir == 2 && 0 <= y - 1 && v[y - 1][x] != 1){ currY = y - 1, currX = x, currDir = dir; return true; } else if (dir == 3 && x + 1 < m && v[y][x + 1] != 1){ currY = y, currX = x + 1, currDir = dir; return true; }
Ver.2
int backDir = (dir + 2) % 4; int ny = y + dirY[backDir]; int nx = x + dirX[backDir]; if (ny >= 0 && ny < n && nx >= 0 && nx < m && v[ny][nx] != 1) { currY = ny; currX = nx; currDir = dir; return true; }
'⭐ 코딩테스트 > 백준' 카테고리의 다른 글
[백준 15787번 C/C++] 기차가 어둠을 헤치고 은하수를 (0) | 2024.07.30 |
---|---|
[백준 14569번 C/C++] 시간표 짜기 (0) | 2024.07.29 |
[백준 17135번 C/C++] 캐슬 디펜스 (0) | 2024.07.25 |
[백준 13335번 C/C++] 트럭 (2) | 2024.07.24 |
[백준 13335번 C/C++] 트럭 (0) | 2024.07.21 |
댓글
이 글 공유하기
다른 글
-
[백준 15787번 C/C++] 기차가 어둠을 헤치고 은하수를
[백준 15787번 C/C++] 기차가 어둠을 헤치고 은하수를
2024.07.30[백준 15787번 C/C++] 기차가 어둠을 헤치고 은하수를 https://www.acmicpc.net/problem/15787 해결전략 비트마스킹 BitMasking 정답코드 #include #include #include using namespace std;int n, m; // n: 기차의 수, m: 명령의 수int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> m; vector v(n, 0); for (int i = 0; i > orderIdx >> train; train--; // 0-based index로 변환 if (orderIdx == 1 || o… -
[백준 14569번 C/C++] 시간표 짜기
[백준 14569번 C/C++] 시간표 짜기
2024.07.29[백준 14569번 C/C++] 시간표 짜기 https://www.acmicpc.net/problem/14569 해결전략 비트마스킹 Bitmasking 정답코드 #include #include using namespace std;int n; // 총 과목의 수int m; // 학생의 수vector lectures; // 각 과목의 시간표를 비트마스크로 저장할 벡터// 시간표를 비트마스크로 변환하는 함수unsigned long long ConvertToBitmask(const vector& times){ unsigned long long binary = 0; for (int i = 0; i > n; lectures.resize(n); for (int i = 0; i > k; … -
[백준 17135번 C/C++] 캐슬 디펜스
[백준 17135번 C/C++] 캐슬 디펜스
2024.07.25[백준 17135번 C/C++] 캐슬 디펜스 https://www.acmicpc.net/problem/17135 해결전략 구현 Brute Force, 너비우선탐색 BFS시뮬레이션 Simulation 정답 코드 #include #include #include #include #include using namespace std;// 방향 벡터 (좌, 상, 우)int dirY[3] = { 0, -1, 0 };int dirX[3] = { -1, 0, 1 };int n, m, d; // 행, 열, 궁수의 공격 거리int answer; // 제거할 수 있는 적의 최대 수vector archers; // 궁수의 위치vector> v; // 초기 적… -
[백준 13335번 C/C++] 트럭
[백준 13335번 C/C++] 트럭
2024.07.24[백준 13335번 C/C++] 트럭 https://www.acmicpc.net/problem/17070 해결전략 동적 계획법 Dynamic Programming, DP 정답코드 #include #include using namespace std;int n;vector> v, result;int dp[16][16][3]; // 0: 가로, 1: 세로, 2: 대각선int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; v.resize(n, vector(n)); result.resize(n, vector(n)); for (int y = 0; y > v[y][x]; } } dp[0][1][0] = 1; // 시작 위치(문…
댓글을 사용할 수 없습니다.