Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- javascript
- bfs
- SQL 고득점 KIT
- Lv. 1
- SQL
- Java
- 동적계획법
- select
- Dynamic Programming
- 파이썬
- 너비 우선 탐색
- Lv. 3
- DP
- C언어
- Lv. 0
- Lv. 2
- level 3
- dfs
- group by
- 티스토리챌린지
- 자바스크립트
- 오블완
- 깊이 우선 탐색
- softeer
- LEVEL 2
- Python
- 프로그래머스
- programmers
- 소프티어
- join
Archives
- Today
- Total
몸과 마음이 건전한 SW 개발자
백준 GOLD 3 [20057번] 마법사 상어와 토네이도 {언어 : Python} 본문
문제 링크
https://www.acmicpc.net/problem/20057
정답 코드
import sys
input = sys.stdin.readline
# 토네이도 방향에 따른 비율
tornadoDirections = {
"L": {
"dr": 0,
"dc": -1,
"list": [(0, -2, 0.05), (-1, -1, 0.1), (1, -1, 0.1), (-1, 0, 0.07), (1, 0, 0.07), (-2, 0, 0.02), (2, 0, 0.02), (-1, 1, 0.01), (1, 1, 0.01)]
},
"D": {
"dr": 1,
"dc": 0,
"list": [(2, 0, 0.05), (1, -1, 0.1), (1, 1, 0.1), (0, 1, 0.07), (0, -1, 0.07), (0, 2, 0.02), (0, -2, 0.02), (-1, 1, 0.01), (-1, -1, 0.01)]
},
"R": {
"dr": 0,
"dc": 1,
"list": [(0, 2, 0.05), (-1, 1, 0.1), (1, 1, 0.1), (1, 0, 0.07), (-1, 0, 0.07), (-2, 0, 0.02), (2, 0, 0.02), (-1, -1, 0.01), (1, -1, 0.01)]
},
"U": {
"dr": -1,
"dc": 0,
"list": [(-2, 0, 0.05), (-1, 1, 0.1), (-1, -1, 0.1), (0, 1, 0.07), (0, -1, 0.07), (0, -2, 0.02), (0, 2, 0.02), (1, -1, 0.01), (1, 1, 0.01)]
}
}
def isValid(nr, nc):
return 0 <= nr < N and 0 <= nc < N
N = int(input())
sand = [list(map(int, input().split())) for _ in range(N)]
# 토네이도 방향 (왼쪽부터)
directionList = ["L", "D", "R", "U"]
# 일부러 3으로 하고 바로 바꿀 수 있게
nowDirection = 3
# 방향에 따른 중심점 움직이기
# 토네이도 길
tornadoWay = []
for num in range(1, N):
for _ in range(2):
tornadoWay.append(num)
tornadoWay.append(N-1)
# 모래 옮기기
sr = sc = N // 2
# 실행
outSand = 0
for tw in tornadoWay:
# tw가 바뀔 때 마다 방향 전환
nowDirection = (nowDirection + 1) % 4
currentD = directionList[nowDirection]
for _ in range(tw):
# 옮겨야할 리스트
lst = tornadoDirections[currentD]["list"]
# 옮겨야할 거리
dr = tornadoDirections[currentD]["dr"]
dc = tornadoDirections[currentD]["dc"]
# 옮길 모래 위치와 모래 양
sr += dr
sc += dc
currentSand = sand[sr][sc]
moveSand = 0
for drr, dcc, percent in lst:
nr = sr + drr
nc = sc + dcc
tmp = int(currentSand * percent)
moveSand += tmp
if isValid(nr, nc):
sand[nr][nc] += tmp
else:
outSand += tmp
# 움직이고 남은 sand
sand[sr][sc] = 0
# a에 위치할 sand
nextR = sr + dr
nextC = sc + dc
if isValid(nextR, nextC):
sand[nextR][nextC] += currentSand - moveSand
else:
outSand += currentSand - moveSand
print(outSand)
풀이 방법
- 토네이도 방향에 따른 비율과 모레가 옮겨지는 위치를 JSON 형태로 저장한다.
- 방향을 리스트 형태와 index + 1 % 4형태로 만든다.
- 토네이도 길을 만드는데 달팽이 문자?의 규칙은 다음과 같다.
- 좌 1 하 1 우 2 상 2 좌 3 하 3 우 4 상 4 ... n번째까지 반복
- n이 7이면
- 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6
- 마지막에 n-1 추가
- 이제 길에 따라서 모래를 움직이고 outSand를 출력하면 끝
- 여기서 주의할점은 a부분은 나머지인 45%가 아니라 모래가 날라가고 남은 양이다.
- 따라서 currentSand에서 moveSand를 빼준 양을 a부분에 += 형태로 추가하면 된다.
느낀점
- 오랜만에 풀었지만 쉬운 문제였다.
- 실수가 잦아서 어디가 틀렸는지 찾기 어려웠는데 결국 방향 부분에서 비율을 잘못 선정한 것이 문제였다.
'알고리즘' 카테고리의 다른 글
백준 SILVER 3 [2236번] 칩 만들기 {언어 : Python} (0) | 2024.02.29 |
---|---|
백준 GOLD 1 [21611번] 마법사 상어와 블리자드 {언어 : Python} (2) | 2024.02.28 |
프로그래머스 [Lv. 1] 신규 아이디 추천 {언어 : JavaScript} (0) | 2024.02.22 |
프로그래머스 [Lv. 2] 하노이의 탑 {언어 : JavaScript} (0) | 2024.02.21 |
프로그래머스 [Lv. 2] 모음 사전 {언어 : Python} (0) | 2024.02.19 |