300x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- kick start
- 킥스타트
- 백준
- 딥러닝
- 운영체제
- 순열
- DFS
- dp
- 코딩테스트
- 네트워크
- 파이썬
- PYTHON
- 그래프
- BFS
- google coding competition
- 알고리즘
- AI
- 동적프로그래밍
- 코딩
- 코딩 테스트
- 구글 킥스타트
- CSS
- OS
- 리눅스
- nlp
- 프로그래밍
- 브루트포스
- 동적 프로그래밍
- linux
- 프로그래머스
Archives
- Today
- Total
오뚝이개발자
[백준 17144] 미세먼지 안녕! 본문
728x90
300x250
문제
https://www.acmicpc.net/problem/17144
나의 풀이
먼지 확산, 먼지 이동
이 두 가지 함수를 짜면 된다.
확산 함수를 짤 때 유의할 점은 먼지가 이미 있던 곳으로도 확산이 일어난다는 점이다.
먼지 이동 함수를 짤 때 유의할 점은 공기청정기를 기준으로 해서 위 아래 순환 방향이 다르다는 점과 공기 청정기로 들어간 먼지는 소멸한다는 점이다.
이동 함수를 짤 때 range 설정이 조금 까다롭긴 하나 차근차근 따져보면 풀 수 있다.
제출은 python3이 시간초과가 나서 pypy3로 했다.
코드
# https://www.acmicpc.net/problem/17144
import sys
input = sys.stdin.readline
import copy
R, C, T = map(int, input().split())
arr = []
for _ in range(R):
arr.append(list(map(int, input().strip().split())))
circulator = []
for i in range(R):
for j in range(C):
if arr[i][j] == -1:
circulator.append([i,j])
def diff():
dust_pos = []
for i in range(R):
for j in range(C):
if arr[i][j] >= 1:
dust_pos.append([i,j,arr[i][j]])
for r,c,d in dust_pos:
for dr, dc in ((-1,0),(1,0),(0,-1),(0,1)):
nr, nc = r + dr, c + dc
if 0<=nr<R and 0<=nc<C and arr[nr][nc]!=-1:
arr[nr][nc] += d//5
arr[r][c] -= d//5
def move():
temp = copy.deepcopy(arr)
# upper
y1, x1 = circulator[0]
arr[y1][1] = 0
for i in range(2, C):
arr[y1][i] = temp[y1][i-1]
for i in range(y1-1, -1, -1):
arr[i][C-1] = temp[i+1][C-1]
for i in range(C-2, -1, -1):
arr[0][i] = temp[0][i+1]
for i in range(1, y1):
arr[i][0] = temp[i-1][0]
# lower
y2, x2 = circulator[1]
arr[y2][1] = 0
for i in range(2, C):
arr[y2][i] = temp[y2][i-1]
for i in range(y2+1, R):
arr[i][C-1] = temp[i-1][C-1]
for i in range(C-2, -1, -1):
arr[R-1][i] = temp[R-1][i+1]
for i in range(R-2, y2, -1):
arr[i][0] = temp[i+1][0]
for _ in range(T):
diff()
move()
ans = 0
for i in range(R):
ans += sum(arr[i])
print(ans+2)
728x90
300x250
'코딩 테스트 > 백준' 카테고리의 다른 글
[백준 11660] 구간 합 구하기 5 (0) | 2022.04.14 |
---|---|
[백준 2096] 내려가기 (0) | 2022.04.07 |
[백준 1504] 특정한 최단 경로 (0) | 2022.04.05 |
[백준 13549] 숨바꼭질 3 (1) | 2022.04.02 |
[백준 1463] 1로 만들기 (0) | 2021.10.04 |
Comments