풀이
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
int dr[4] = { -1,0,1,0 };
int dc[4] = { 0,1,0,-1 };
int main() {
int map[100][100] = { 0, }; //이동 가능한 곳을 0으로 저장
vector<pair<int, char>> dir;
int N, K, L, X, temp1, temp2;
char C;
cin >> N;
cin >> K;
for (int i = 0; i < K; i++) {
cin >> temp1;
cin >> temp2;
map[temp1 - 1][temp2 - 1] = 2; //사과가 있는 곳은 3
}
cin >> L;
for (int i = 0; i < L; i++) {
cin >> temp1;
cin >> C;
dir.push_back(make_pair(temp1, C));
}
//입력 완료
vector<pair<int, int>> snake; //뱀의 흔적을 저장할 좌표 (꼬리 줄이기용)
int H = 1, row = 0, col = 0, sec = 0;
map[row][col] = 1; //뱀이 있는 곳은 1이므로 시작점map[0][0]=1
snake.push_back(make_pair(row, col)); //뱀의 꼬리 위치 행=0, 열=0
while (1) {
if ((dir.size() > 0) && (dir[0].first == sec)) { //움직여야 할 시간이면 방향부터 바꿈
if (dir[0].second == 'D') {
H++;
H %= 4;
}
else {
if (H == 0)
H = 3;
else
H--;
}
dir.erase(dir.begin()); //움직인 시간과 방향 삭제 (sec==dir[0]을 기준으로 판단하므로)
}
sec++; //시간 증가
row += dr[H]; //행 좌표 이동
col += dc[H]; //열 좌표 이동
if ((row < 0) || (row > N - 1) || (col < 0) || (col > N - 1)) //범위 밖이면 break
break;
if (map[row][col] == 2) { //사과가 있는 곳이면
map[row][col] = 1; //사과를 먹고 꼬리는 그대로
snake.push_back(make_pair(row, col)); //후에 꼬리를 줄이기 위해 좌표 입력
}
else if (map[row][col] == 0) { //사과도 없고 뱀의 몸도 없음
map[row][col] = 1; //머리 이동한 후
snake.push_back(make_pair(row, col)); //흔적 저장
map[snake[0].first][snake[0].second] = 0; //꼬리 이동
snake.erase(snake.begin()); //꼬리 줄이기
}
else
break;
}
cout << sec;
}
풀이
* 이동할 때마다 머리를 먼저 늘이고 꼬리를 움직이기 때문에, 뱀의 꼬리가 있었지만 몸을 줄여 없어질 자리이더라도 머리가 먼저 들어가면 몸에 닿는다. 따라서 break.
'코테 > 구현' 카테고리의 다른 글
[C/C++] 프로그래머스 스쿨 기둥과 보, 구현 (0) | 2023.02.26 |
---|---|
[C/C++] 프로그래머스스쿨 자물쇠와 열쇠, 구현 (0) | 2023.02.26 |
[C/C++] 프로그래머스스쿨 문자열압축, 구현 (0) | 2023.02.16 |
[C/C++] 나동빈 문자열 재정렬, 구현 (0) | 2023.02.15 |
[C/C++] 백준 18406, 구현 (0) | 2023.02.15 |