#14503

zzwwoonn·2022년 5월 23일
0

Algorithm

목록 보기
31/71

삽질 과정

N, M = map(int, input().split())

spaceMap = []
visitMap = [ [0] * M for i in range[N] ]

completeClean = 0

row, col, see = map(int, input().split())

for i in range(N):
    spaceMap.append(list(map(int, input().split())))
    
while(1):
    # 처음에 출발점은 무조건 빈 공간

    # 들어오면 무조건 청소
    completeClean += 1
    visitMap[row][col] = 1
    # 방문 체크 -> 거기 청소했다.
        
    # 4방향 체크하고 한칸 전진
    if see == 0:
        # 위쪽을 보고있다.
        if visitMap[row][col-1] == 0 and spaceMap[row][col-1] == 0:
        # 왼쪽이 방문 안한 곳이고 , 벽이 아닐 경우
            see = 3
            # 왼쪽 쳐다보게 하고
            col -= 1 
            # 한칸 전진
            continue
        else:
            # 아래쪽
            ...


    if see == 1 and spaceMap[row-1][col] == 0:
        # 오른쪽 보고 있고, 위쪽이 벽이 아닐 경우
        see = 0 
        # 위쪽 쳐다보게 하고
        row -= 1
        # 한칸 전진
        continue

    if see == 2 and spaceMap[row][col+1] == 0:
        # 아래쪽 보고 있고, 오른쪽이 벽이 아닐 경우
        see = 1
        # 오른쪽 쳐다보게 하고
        col += 1 
        # 한칸 전진
        continue

    if see == 3 and spaceMap[row+1][col] == 0:
        # 왼쪽 보고 있고, 아래쪽이 벽이 아닐 경우
        see = 2
        # 아래쪽 쳐다보게 하고
        row += 1
        # 한칸 전진
        continue
    
    

        
    # 4방향 다 돌고 후진 했는데 벽인 경우 while 리턴
    if see == 0 and spaceMap[row+1][col] == 1:
        break
    if see == 1 and spaceMap[row][col-1] == 1:
        break
    if see == 2 and spaceMap[row-1][col] == 1:
        break
    if see == 3 and spaceMap[row][col+1] == 1:
        break

정답 코드

N, M = map(int, input().split())

spaceMap = []
visitMap = [ [0] * M for i in range(N) ]

dx = [-1,0,1,0]
# row
dy = [0,1,0,-1]
# col

# [0] : 위쪽, [1] : 오른쪽, [2] : 아래쪽, [3] : 왼쪽

completeClean = 0

row, col, see = map(int, input().split())
# print(row, col, see)

for i in range(N):
    spaceMap.append(list(map(int, input().split() ) ) )

def turnLeft():
    global see
    see -= 1
    if see == -1:
        see = 3
        # 위 다음 왼쪽으로 돌아

visitMap[row][col] = 1
completeClean += 1
# cnt = 1

# 처음 있는 곳 청소
# 1.현재 위치를 청소한다.

# see
# 0 -> 위
# 1 -> 오른
# 2 -> 아래
# 3 -> 왼
turnCnt = 0

while(1):    

    flag = 0

    # 2.현재 위치에서 다음을 반복하면서 인접한 칸을 탐색한다.
    # 탐색 순서 : 현재 보고 있는 방향에서 왼쪽->아래쪽->오른쪽->위쪽

    # 왼쪽 쳐다보기
    for _ in range(4):
        turnLeft()
        # 왼쪽으로 한번 회전해라

        # 다음으로 이동하려는 위치, 가려고 쳐다 본 위치
        nx = row + dx[see]
        ny = col + dy[see]

        if 0 <= nx < N and 0 <= ny < M and spaceMap[nx][ny] == 0:
            # 가려는 곳이 범위 내에 있는 곳이고, 벽이 아닌 경우

            if visitMap[nx][ny] == 0:
                # 방문 안한 곳인 경우
                visitMap[nx][ny] = 1
                # 방문 체크

                completeClean += 1
                # 청소 하기

                row = nx
                col = ny
                # 위치 실제로 이동

                #청소 한 방향이라도 했으면 다음으로 넘어감
                flag = 1
                break

    if flag == 0: # 4방향 모두 청소가 되어 있을 때,
        if spaceMap[row-dx[see]][col-dy[see]] == 1: 
            #후진했는데 벽이 나오는 경우
            print(completeClean)
            break
        else:
            # 그게 아니면 
            row = row-dx[see]
            col = col-dy[see]

2차원 배열에서 4가지 방향(상, 하, 좌, 우)을 방문하거나 확인해야 하는 경우

dx = [-1,0,1,0]
# row
dy = [0,1,0,-1]
# col

# 다음으로 이동하려는 위치, 가려고 쳐다 본 위치
    nx = row + dx[see]
    ny = col + dy[see]

를 활용 하면 조금 더 간편하고 쉽게 구현이 가능하다.

빡구현 문제였다.

결론은.. 진짜 말도 안되게 어려웠다고 생각했지만 막상 풀고나니 못풀 정도의 문제는 아니었고 dx,dy 활용법에 대해 완벽히 익혀서 좋았다?

또... 빡구현 문제는 그냥 하라는 대로만 정확하게 하면 된다.. 정도?

0개의 댓글