Algorithm/Implementation

[Baekjoon 14503 / Python / 골드5] 로봇 청소기

양선규 2024. 10. 7. 15:34
728x90
반응형

문제

 

구현, 시뮬레이션 문제이다. 문제에 적힌 그대로 구현하면 풀리지만, 코드로 옮기는 과정에서 한두개의 실수조차 범하지 않기는 어렵다. 복잡한 로직은 필요 없이 문제를 아주 세심히 읽고 오차 없이 완벽하게 구현해내면 된다. 물론 난 제대로 안읽어서 고생했다.

 

# 구현, 시뮬레이션
import sys
input = sys.stdin.readline

# 입력받기
N, M = map(int, input().split())
x, y, d = map(int, input().split())
room = [list(map(int, input().split())) for _ in range(N)]

# 0, 1, 2, 3 -> 북 동 남 서
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

# 청소 시작
room[x][y] = 2
result = 1
def cleaner(x, y, d):

    global result

    # 무한루프 방지를 위한 for문
    for _ in range(50**3):
        clean = False # 청소여부

        # 4방향 탐색
        for _ in range(4):
            d = (d + 3) % 4
            nx = x + dx[d]
            ny = y + dy[d]

            # 미청소 구역일 경우 전진
            if room[nx][ny] == 0:
                clean = True
                room[nx][ny] = 2
                result += 1
                x, y = nx, ny
                break
       
        # 4방향 갈곳이 없으면 후진 ( 방향 유지 )
        if not clean:
            tmpDir = (d + 2) % 4
            nx = x + dx[tmpDir]
            ny = y + dy[tmpDir]
       
        # 후진했는데 벽이라면 종료
        if room[nx][ny] == 1:
            return
        x, y = nx, ny

# 결과 출력
cleaner(x, y, d)
print(result)

 

구현해 놓고 보면 간단하다. 그냥 문제 지문 자체가 정답이니까.

 

헷갈렸던 부분을 살펴보자면

1. 첫 번째 위치 청소 체크 안 한것

2. 후진 시 방향 변경하면 안되는데 한것

3. 반시계 방향이라고 해 놓고 문제 입력값 0, 1, 2, 3은 시계 방향으로 주어진 것

4. 반시계 방향전환 로직 그 자체

 

이 정도다. 특히 이 중에서 4번이 매우 헷갈렸다.

시뮬레이션 문제를 많이 안 풀어보기도 했고 어떻게 해야 반시계 방향으로 쉽게 전환을 할 수 있지.. 머리를 싸매고 특이하게 구현했었는데 자꾸 틀려서 방향 변경 로직만 다른 코드를 참고했다.

 

directions = [3, 2, 1, 0]  # 서, 남, 동, 북
num = directions.index(d)   # directions[num % 4] 하면 방향 나옴
dx = [0, 1, 0, -1]          # 서, 남, 동, 북
dy = [-1, 0, 1, 0]

 

처음엔 이렇게 구현해서 directions[num % 4] + 2 % len(dx) 뭐 막 이런 식으로 복잡하게 했었는데 내가 봐도 헷갈리고 이상하게 테스트 케이스에서 오차가 조금씩 있었어서.. 분명히 방향 전환을 쉽게 딱 할 수 있는 코드가 있을 것 같은데 내 머리론 생각해내지 못했다. 그래서 다른 코드 방향 전환 부분만 약간 참고하게 됐다.

 

전체적인 로직은 다 맞는 거 같은데 계속 틀려서 뭐가 문제지 하다가 방향 전환 부분만 바꾸니 쉽게 통과되었다.

내 부족함 때문에 조금 헤매긴 했지만, 결국 문제 지문을 잘 숙지한다면 쉽게 풀렸을 문제인 것 같다.

 

 

결과

pypy3으로 제출 시 메모리, 시간 모두 비효율적이다.

728x90
반응형