JB의 이모저모
[코드트리 챌린지] 3주차 - 청소는 즐거워 🥇3 본문
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
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만큼이라고 생각하고 계산하여 예시와 다른 정답이 나왔다. α값을 제대로 이해하였다면 빠르게 문제해결이 가능했을 것 같다.
- 문제이해가 가장 중요하다. 문제를 꼼꼼히 읽고 이해하는 습관을 기르자
'알고리즘 > 코드트리' 카테고리의 다른 글
[ 코드트리 삼성 SW 역량테스트 2024 하반기 오전 1번 문제 Python] 미지의 공간 탈출 (0) | 2024.10.15 |
---|---|
[코드트리 챌린지] 2주차 - 병원 거리 최소화하기 🥇5 (0) | 2023.09.17 |
[코드트리 챌린지] 1주차 - 방화벽 설치하기 🥇4 (0) | 2023.09.06 |