728x90
https://www.acmicpc.net/problem/14503
import sys; input=sys.stdin.readline
N, M = map(int, input().split())
r, c, d = map(int, input().split())
room = [list(map(int, input().split())) for _ in range(N)]
clean = [[0 for _ in range(M)] for _ in range(N)]
direction = [(-1, 0), (0, 1), (1, 0), (0, -1)]
answer = 0
while True:
# 1 현재 위치 청소
if not clean[r][c]:
clean[r][c] = 1
answer += 1
# 2 현재 위치에서 현재 방향을 기준으로 왼쪽방향부터 차례로 탐색
break_chk = False
for ddir in range(1, 5):
tmp = direction[(d - ddir) % 4]
# a 왼쪽 방향에 아직 청소하지 않은 공간이 존재하면 그 방향으로 회전한 다음 한칸 전진 후 1번으로 돌아감
# b 왼쪽 방향에 청소할 공간이 없다면 그방향으로 회전하고 2번으로 돌아감
if 0 <= r + tmp[0] < N and 0 <= c + tmp[1] < M:
if not clean[r + tmp[0]][c + tmp[1]] and not room[r + tmp[0]][c + tmp[1]]:
r += tmp[0]
c += tmp[1]
d = (d - ddir) % 4
break_chk = True
break
else:
# 네방향 모두 이미 청소가 되어있거나 벽인 경우
tmp = direction[d]
if 0 <= r - tmp[0] < N and 0 <= c - tmp[1] < M:
# 뒤쪽 방향도 벽인경우
if room[r - tmp[0]][c - tmp[1]]:
break
# 바라보는 방향을 유지한채로 한칸 후진후 2번으로 돌아감
r -= tmp[0]
c -= tmp[1]
print(answer)
시뮬레이션 문제이고 문제에 있는 그대로 작성하여 풀었다.
더보기
- 현재 위치를 청소한다.
- 현재 위치에서 현재 방향을 기준으로 왼쪽방향부터 차례대로 탐색을 진행한다.
- 왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 그 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행한다.
- 왼쪽 방향에 청소할 공간이 없다면, 그 방향으로 회전하고 2번으로 돌아간다.
- 네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유지한 채로 한 칸 후진을 하고 2번으로 돌아간다.
- 네 방향 모두 청소가 이미 되어있거나 벽이면서, 뒤쪽 방향이 벽이라 후진도 할 수 없는 경우에는 작동을 멈춘다.
어렵지 않은 문제였다
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int N, M;
int r, c, d;
int room[50][50] = { 0, };
int clean[50][50] = { 0, };
int dr[4] = { -1,0,1,0 };
int dc[4] = { 0,1,0,-1 };
int main() {
int i, j, break_chk, ddir, tmp;
scanf("%d %d", &N, &M);
scanf("%d %d %d", &r, &c, &d);
for (i = 0; i < N; i++) {
for (j = 0; j < M; j++) {
scanf("%d", &room[i][j]);
}
}
int answer = 0;
while (1) {
if (!clean[r][c]) {
clean[r][c] = 1;
answer++;
}
break_chk = 0;
for (ddir = 1; ddir < 5; ddir++)
{
tmp = (d - ddir + 4) % 4;
if (0 <= r + dr[tmp] && r + dr[tmp] < N && 0 <= c + dc[tmp] && c + dc[tmp] < M) {
if ((!clean[r + dr[tmp]][c + dc[tmp]]) && (!room[r + dr[tmp]][c + dc[tmp]])) {
r += dr[tmp];
c += dc[tmp];
d = tmp;
break_chk = 1;
break;
}
}
}
if (!break_chk) {
if (0 <= r - dr[d] && r - dr[d] < N && 0 <= c - dc[d] && c - dc[d] < M) {
if (room[r - dr[d]][c - dc[d]])
break;
r -= dr[d];
c -= dc[d];
}
}
}
printf("%d\n", answer);
return 0;
}
C에서는 (-3 % 4) 이런 문법이 적용되지 않아서 4를 더 더해서 사용했다.
나머지는 파이썬과 같은 코드 이다.
'STUDY > Algorithm' 카테고리의 다른 글
[프로그래머스] 쿼드압축 후 개수 세기, 월간 코드 챌린지 시즌1, python (0) | 2021.07.18 |
---|---|
[백준] 1916 최소비용 구하기 python (0) | 2021.07.15 |
[백준] 2108 통계학, python (0) | 2021.07.11 |
[백준] 16234 인구 이동 python(pypy3) (0) | 2021.07.08 |
[백준] 15686 치킨 배달, python (0) | 2021.07.06 |