[백준] 21610번: 마법사 상어와 비바라기

yoonene·2022년 10월 14일
0

알고리즘

목록 보기
21/62

문제 이동

소요시간 : 2시간 10분
체감 난이도 : 하
유형 : 구현

틀렸습니다

if m > 1 조건으로 이동을 하였더니 m=1일 때 오류가 났다.
if m = 0 으로 수정해서 맞았다.

문제 이해

문제를 차근히 이해해서 풀었지만 다음 문장에서 잘못 이해해서 시간이 걸렸다.

이때 구름이 생기는 칸은 3에서 구름이 사라진 칸이 아니어야 한다.

이전 이동에서 사라진 칸도 포함하는 줄 알았으나 해당 이동에서 사라진 칸만을 의미했다.

프린트문으로 노가다 디버깅해서 수정했다.


코드

N ,M = map(int,input().split())
board = [list(map(int, input().split())) for _ in range(N)]
move_lst = [list(map(int, input().split())) for _ in range(M)]

dr = (0, -1, -1, -1, 0, 1, 1, 1)
dc = (-1, -1, 0, 1, 1, 1, 0, -1)



def move(d, s):
    global board, cloud_lst
    move_to = []
    for cloud in cloud_lst:
        # 1. 이동
        nr, nc = (cloud[0] + dr[d]*s) % N, (cloud[1] + dc[d]*s) % N
        # print(cloud, " -> ", (nr, nc))
        # 2. 이동 후 칸에 물 + 1
        board[nr][nc] += 1
        move_to.append((nr, nc))
    # 4. 2에서 증가한 칸 주변 물 있는 칸 수만큼 더해줌
    cnt_lst = []
    for nr, nc in move_to:
        cnt = 0
        # print("(nr, nc)", (nr, nc))
        # print("인접 칸")
        for d in [1, 3, 5, 7]:
            # print((nr+dr[d], nc + dc[d]))
            if 0<=nr + dr[d]<N and 0<=nc + dc[d]<N:
                if board[nr + dr[d]][nc + dc[d]] > 0:
                    cnt += 1
        cnt_lst.append((nr, nc, cnt))
    # print("인접 카운트", cnt_lst)
    # 사라진 구름들
    for nr, nc, cnt in cnt_lst:
        board[nr][nc] += cnt

    return move_to


def gen_cloud(dis_cloud):
    global board, cloud_lst
    # old_cloud.extend(cloud_lst)
    # 3. 구름 사라짐
    cloud_lst = []
    # print(dis_cloud)
    # 5. 구름 생성, 물의 양 2 줄이기
    for r in range(N):
        for c in range(N):
            if (r, c) not in dis_cloud:
                if board[r][c] >= 2:
                    cloud_lst.append((r, c))
                    board[r][c] -= 2


if M > 0:
    cloud_lst = [(N-1, 0), (N-1, 1), (N-2, 0), (N-2, 1)]
    dis_cloud = []

    for d, s in move_lst:
        dis_cloud = move(d-1, s)  # 1,2,4번
        # print("이동 끝난 후", board)
        gen_cloud(dis_cloud)
        # print("구름 생성 후", board)
        # print("이동한 구름 칸", cloud_lst)
        # print("-"*50)

print(sum(sum(board, [])))
# print(cloud_lst)
profile
NLP Researcher / Information Retrieval / Search

0개의 댓글