# 모래 날리기
# i,j,날려야 할 모래의 크기,날리는 방향
def blow(I, J, sand, blow_dir):
global res
# 얼마나 날렸는지 저장
temp = 0
for w in range(5):
for e in range(5):
if rate[blow_dir][w][e] != 0:
if rate[blow_dir][w][e] != 'a':
if int(sand * rate[blow_dir][w][e]) > 0:
if 0 <= I + rate_x[w] < N and 0 <= J + rate_y[e] < N:
sandbox[I + rate_x[w]][J + rate_y[e]] += int(sand * rate[blow_dir][w][e])
else:
res += int(sand * rate[blow_dir][w][e])
temp += int(sand * rate[blow_dir][w][e])
# 'a'의 위치 기억해두기
else:
temp_i = I + rate_x[w]
temp_j = J + rate_y[e]
# a의 위치가 모래밭 안 넘어가면
if 0 <= temp_i < N and 0 <= temp_j < N:
sandbox[temp_i][temp_j] += sand - temp
# 넘어가면 결과값에 저장
else:
res += sand - temp
return
# 격자의 크기
N = int(input())
# 모래밭
sandbox = [list(map(int,input().split())) for _ in range(N)]
# 시작 위치
i = N//2
j = N//2
# 방향, 왼, 아래, 오, 위
x = [0,1,0,-1]
y = [-1,0,1,0]
# 초반 방향
dir = 0
# 몇 칸 이동해야 하는지, dir_cnt[0]칸을 몇 번 이동했는지
# dir_cnt[0]칸을 2번 이동하면 dir_cnt[0]에 +1 해줘야 함
dir_cnt = [1, 0]
# 모래가 뿌려지는 비율 /// 왼쪽, 아래, 오른쪽, 위
rate = [[[0,0,0.02,0,0], [0,0.1,0.07,0.01,0], [0.05,'a',0,0,0], [0,0.1,0.07,0.01,0], [0,0,0.02,0,0]],
[[0,0,0,0,0], [0,0.01,0,0.01,0], [0.02,0.07,0,0.07,0.02], [0,0.1,'a',0.1,0], [0,0,0.05,0,0]],
[[0,0,0.02,0,0], [0,0.01,0.07,0.1,0], [0,0,0,'a',0.05], [0,0.01,0.07,0.1,0], [0,0,0.02,0,0]],
[[0,0,0.05,0,0], [0,0.1,'a',0.1,0], [0.02,0.07,0,0.07,0.02], [0,0.01,0,0.01,0], [0,0,0,0,0]]]
# 함수에서 사용하기 위한 것??????
rate_x = [-2,-1,0,1,2]
rate_y = [-2,-1,0,1,2]
# 모래밭 밖으로 나가는 모래의 합
res = 0
# 탈출 조건
check = 1
while check < N * N:
for q in range(dir_cnt[0]):
i += x[dir]
j += y[dir]
blow(i,j,sandbox[i][j],dir)
check += 1
# 현재 방향 값이 3이면 0으로 초기화
if dir == 3:
dir = 0
else:
dir += 1
# 이동해야할 칸의 숫자는 두 번 이동한 후 +1칸이 됨
# 시작 지점에서 왼쪽으로 1칸, 그 다음 아래쪽으로 1칸 이동
# 그 다음 오른쪽으로 2칸 이동 후 위쪽으로 2칸 이동
# 다시 왼쪽으로 3칸 ... 반복 됨
if dir_cnt[1] == 0:
dir_cnt[1] = 1
else:
# 단, 마지막은(i값이 0인 행) 이 전 이동한 칸수 반복
if i == 0 and j == N-1:
pass
else:
dir_cnt[1] = 0
dir_cnt[0] += 1
print(res)
그 외
문제 풀이를 위한 아이디어
1. 바람이 어떻게 이동할 것인가를 결정해야 함
2. 이동 방향에 따라서 모래가 뿌려지는 비율을 어떻게 인식시켜줄 것인지
(사실 방향에 따라 모래가 뿌려지는 비율은 변화하지 않음 ex) 모래 입장에서 생각해보면 7%는 항상 자신의 왼쪽 오른쪽임
그러나 나는 저런 방법으로 문제를 해결할 지식이 없음...)
3. 문제에서는 1,1까지 가면 멈춘다고 나와있지만 이는 0,0을 의미함
(나는 시작점을 0,0으로 생각해왔는데...)
내가 해결한 방식
1. 가장 간단한 방법은 4 방향을 설정한 후, 각 방향에 따른 모래가 뿌려지는 비율을 if를 사용해서 하나씩 지정해주는 것
2. 그러나 코드의 길이가 너무 길어지고 보기에 지저분하다는 생각이 들었음
3. 그래서 모래가 뿌려지는 비율을 저장해두고 매번 호출하여 사용하는 방식으로 문제 해결
4. 날려야할 모래의 크기가 10보다 작을 경우에는 계산이 필요 없긴 함(소수점 이하는 제거하기 때문에 그냥 a로 그대로 넘겨주기만 하면 됨, 근데 귀찮아서 안 함...)
5. 문제를 해결하는 속도는 모든 조건에 if를 달아서 해결하는 방식이 좀 더 빠르지 않을까라는 생각이 들긴함...
ps. 개인적인 코드와 코드를 작성의 이유를 적은 것입니다.
오류나 적절치 않은 문법이 존재할 수 있으며, 다른 분들께는 굉장히 비효율적인 방법으로 여겨질 수 있습니다.
혹시 개선 사항, 오류 및 문제에 대한 수정 사항 등을 댓글로 남겨주신다면 감사한 마음으로 배우고 수정하겠습니다
'코딩 문제해결 > 문제 풀이.백준' 카테고리의 다른 글
[BOJ/백준 코딩] 보물 - PYTHON #1026 (0) | 2021.01.31 |
---|---|
[BOJ/백준 코딩] 숫자판 점프 - PYTHON #2210 (0) | 2021.01.31 |
[BOJ/백준 코딩] 연길이의 이상형 - PYTHON #20540 (0) | 2021.01.17 |
[BOJ/백준 코딩] 문홍안 - PYTHON #14649 (0) | 2021.01.10 |
[BOJ/백준 코딩] 쿼리 맛보기 - PYTHON #14648 (0) | 2021.01.10 |