728x90
반응형
https://www.acmicpc.net/workbook/view/1152
https://www.acmicpc.net/problem/3190
문제 해결 방법
1. 현재 위치를 담을 queue를 만들고 현재위치를 표시한다
(사과를 먹었을 때는 몸이 길어져서 pop()을 하지않고, 먹지 않았을때는 맨 끝 위치를 pop() 해준다)
2. 현재의 방향을 저장할 변수를 선언한다
3. 뱀의 방향 전환에 필요한 배열을 만들어준다
4. L개의 방향 변환 정보가 끝나도 벽과 자신에 부딪히지 않았다면 현재 방향으로 쭉 간다
#include <iostream>
#include <queue>
using namespace std;
int n, k, l;
int map[101][101];
int dy[] = {1, 0, -1, 0}; // 오른쪽, 아래, 왼쪽, 위
int dx[] = {0, 1, 0, -1};
int t = 0; // 시간
bool check(int x, int y){
if(x<=0 || x>n || y<=0 || y>n) // 벽과 부딪힌 경우
return false;
if(map[x][y] == 2) // 자신과 부딪힌 경우
return false;
return true;
}
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
queue<pair<int, char>> q;
cin >> n >> k;
for(int i=0; i<k; i++){
int x, y;
cin >> x >> y;
map[x][y] = 1;
}
cin >> l;
for(int i=0; i<l; i++){
int x; char c;
cin >> x >> c;
q.push({x, c});
}
int x = 1, y = 1; // 현재 위치
queue<pair<int, int>> now;
now.push({x, y});
int d = 0; // 현재 방향
int nx, ny;
while(1){
int n = q.front().first;
char c = q.front().second;
q.pop();
while(t != n){
nx = x + dx[d];
ny = y + dy[d];
t++;
if(!check(nx, ny)){ // 벽이나 자신과 부딪혔는지 확인
cout << t;
return 0;
}
now.push({nx, ny});
if(map[nx][ny]!=1){ // 사과를 먹지 않은 경우
int first = now.front().first;
int second = now.front().second;
map[first][second] = 0;
now.pop();
}
map[nx][ny] = 2; // 현재 위치 표시
x = nx;
y = ny;
}
if(c == 'D'){
if(d==3) d = 0;
else d += 1;
} else {
if(d==0) d = 3;
else d -= 1;
}
}
}
q가 비어있는 상태에서 q.front()를 호출해도 정상적으로 작동할까 궁금했는데
이처럼 쓰레기값이 들어가긴 하지만 조건에 맞아 잘 작동했다
728x90
반응형
'알고리즘 > 시뮬레이션 & 구현' 카테고리의 다른 글
[백준/구현/C++] 14500번 테트로미노 (0) | 2023.01.18 |
---|---|
[백준/수학/C++] 17425번 약수의 합 (0) | 2023.01.17 |
[백준/수학/C++] 17427번 약수의 합 2 (0) | 2023.01.17 |
[백준/수학/C++] 1037번 약수 (2) | 2023.01.16 |
[백준/구현/C++] 14503번 로봇 청소기 (삼성 SW 역량 테스트 기출) (0) | 2023.01.13 |