JB의 이모저모

[코드트리 챌린지] 3주차 - 청소는 즐거워 🥇3 본문

알고리즘/코드트리

[코드트리 챌린지] 3주차 - 청소는 즐거워 🥇3

J B 2023. 9. 25. 23:49

https://www.codetree.ai/training-field/frequent-problems/problems/cleaning-is-joyful?&utm_source=clipboard&utm_medium=text

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

⭕ CODE

# wind[0] -> 왼쪽 wind[1] -> 아래 wind[2] -> 오른쪽 wind[3] -> 위
wind = [
    [(0, -2, 0.05), (-1, -1, 0.1), (1, -1, 0.1), (-2, 0, 0.02), (2, 0, 0.02), (-1, 0, 0.07), (1, 0, 0.07), (1, 1, 0.01),
     (-1, 1, 0.01)],
    [(2, 0, 0.05), (1, -1, 0.1), (1, 1, 0.1), (0, 2, 0.02), (0, -2, 0.02), (0, 1, 0.07), (0, -1, 0.07), (-1, 1, 0.01),
     (-1, -1, 0.01)],
    [(0, 2, 0.05), (-1, 1, 0.1), (1, 1, 0.1), (-2, 0, 0.02), (2, 0, 0.02), (-1, 0, 0.07), (1, 0, 0.07), (-1, -1, 0.01),
     (1, -1, 0.01)],
    [(-2, 0, 0.05), (-1, -1, 0.1), (-1, 1, 0.1), (0, 2, 0.02), (0, -2, 0.02), (0, 1, 0.07), (0, -1, 0.07), (1, 1, 0.01),
     (1, -1, 0.01)]]

# 방향
dx = [0, 1, 0, -1]
dy = [-1, 0, 1, 0]


def sand(x, y, d):
    # 그 자리에 있던 모래양
    here = arr[x][y]
    # 바람이 불어서 날아가야하므로 arr[x][y]를 0으로 바꿔준다.
    arr[x][y] = 0

    # α값을 계산해주기위한 zz
    zz = 0

    # 바람이 불면 흩어지는 9방향에 대해서
    for i in range(9):
        nx = x + wind[d][i][0]
        ny = y + wind[d][i][1]

        # 격자 안에 존재 한다면
        if 0 <= nx < n and 0 <= ny < n:
            # 그 위치에 그 비율만큼 곱해서 더해준다
            # int()를 함으로서 소수점 아래 버리기
            arr[nx][ny] = int(arr[nx][ny] + here * wind[d][i][2])

            # α값을 계산하기 위해서 흩어져간 모래양을 더해준다
            zz += int(here * wind[d][i][2])
        # 격자 밖으로 떨어져 나간 모래도 더해준다
        else:
            zz += int(here * wind[d][i][2])

    # α의 위치
    nx = x + dx[d]
    ny = y + dy[d]

    # 격자안에 존재한다면
    if 0 <= nx < n and 0 <= ny < n:
        # 그자리에 있던 모래양에서 흩어져나간 모래양을 추가로 더해준다
        arr[nx][ny] += here - zz


n = int(input())

arr = [list(map(int, input().split())) for _ in range(n)]

# 처음 존재하는 모래양에서 나중에 바람이 다 불고 남은 모래양을 빼면
# 격자 밖으로 나간 모래양을 구할 수 있다.
total_sand = 0
for i in range(n):
    for j in range(n):
        total_sand += arr[i][j]

# 토네이도가 움직이는 거리를 담을 리스트
tornado = []
# 토네이도는 같은 거리를 두번씩 움직인다.
for i in range(1, n):
    tornado.append(i)
    tornado.append(i)
# 마지막은 n-1만큼가서 (0,0)으로 간다.
tornado.append(n - 1)

# [1, 1, 2, 2, 3, 3, 4, 4, 4]

# 중앙 위치
x, y = n // 2, n // 2

# 방향을 정할 d
d = 0

for i in tornado:
    count = 0
    while count < i:
        # 다음 위치
        x += dx[d]
        y += dy[d]
        count += 1
        # 다음구역에 모래가 있다면
        if arr[x][y] > 0:
            sand(x, y, d)
    # 방향
    d = (d + 1) % 4

# 바람이 다 지나가고 난 후 모래양을 구한다
total = 0
for i in range(n):
    for j in range(n):
        total += arr[i][j]

print(total_sand - total)copy

✏️ Comment

단순 구현인데 시간이 엄청 걸렸다. α값을 처음에 0.55만큼이라고 생각하고 계산하여 예시와 다른 정답이 나왔다. α값을 제대로 이해하였다면 빠르게 문제해결이 가능했을 것 같다.

 

  • 문제이해가 가장 중요하다. 문제를 꼼꼼히 읽고 이해하는 습관을 기르자