일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 17144번
- 15686번
- SW ExpertAcademy
- 2020 카카오 인턴십
- SW Expert Academy
- 프로그래머스
- 감소하는 수
- 12869번
- 14499번
- 보석 쇼핑
- 스타트 택시
- 백준 알고리즘
- 19238번
- HTML 기초
- 어른 상어
- 베스트엘범
- 1038번
- python
- 미세먼지 안녕!
- 12865번
- 1789번
- 9095번
- 거울 설치
- 수식 최대화
- 빛의 경로 사이클
- 16234번
- 파이썬
- 키패드 누르기
- 경주로 건설
- QueryDSL 기초
Archives
- Today
- Total
보물창고 블로그
백준 알고리즘 17822번 원판 돌리기 풀이 With Python 본문
728x90
문제 링크: https://www.acmicpc.net/problem/17822
17822번: 원판 돌리기
반지름이 1, 2, ..., N인 원판이 크기가 작아지는 순으로 바닥에 놓여있고, 원판의 중심은 모두 같다. 원판의 반지름이 i이면, 그 원판을 i번째 원판이라고 한다. 각각의 원판에는 M개의 정수가 적혀있고, i번째 원판에 적힌 j번째 수의 위치는 (i, j)로 표현한다. 수의 위치는 다음을 만족한다. (i, 1)은 (i, 2), (i, M)과 인접하다. (i, M)은 (i, M-1), (i, 1)과 인접하다. (i, j)는 (i, j-1), (i, j
www.acmicpc.net
문제는 아래와 같습니다.
문제는 그다지 어려운 편은 아니었다. 나는 같은 것을 지우는 데에 BFS(너비 우선 탐색)을 사용하였지만, 다른 사람들의 코드를 보니 굳이 BFS를 쓸 필요가 없었다. 단순한 for 문으로 충분히 해결할 수 있었다. 다만 BFS를 사용하면 탐색을 필요 이상으로 하여서 나의 코드가 너무 조잡해 보였다. 다음에 꼭 다시 풀어봐야겠다. 해결한 코드는 아래와 같습니다.
import sys
from collections import deque
dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]
n, m, t = map(int, sys.stdin.readline().split())
time = 0
answer = 0
number = n * m
map1 = []
visit = [[-1] * m for _ in range(n)]
for _ in range(n):
s = list(map(int, sys.stdin.readline().split()))
answer += sum(s)
s = deque(s)
map1.append(s)
order = [list(map(int, sys.stdin.readline().split())) for _ in range(t)]
while time < t:
flag = 0
x, d, k = order[time]
for i in range(n):
if (i + 1) % x == 0:
if d == 0:
map1[i].rotate(k)
else:
map1[i].rotate(-k)
for i in range(n):
for j in range(m):
if visit[i][j] == time or map1[i][j] == 0:
continue
delete = []
k = map1[i][j]
visit[i][j] = time
queue = deque([[i, j]])
while queue:
x1, y1 = queue.popleft()
if y1 == 0 and map1[x1][m - 1] == k and visit[x1][m - 1] != time:
visit[x1][m - 1] = time
queue.append([x1, m - 1])
delete.append([x1, m - 1])
elif y1 == m - 1 and map1[x1][0] == k and visit[x1][0] != time:
visit[x1][0] = time
queue.append([x1, 0])
delete.append([x1, 0])
for d in range(4):
nx = x1 + dx[d]
ny = y1 + dy[d]
if -1 < nx < n and -1 < ny < m and map1[nx][ny] == k and visit[nx][ny] != time:
visit[nx][ny] = time
queue.append([nx, ny])
delete.append([nx, ny])
if delete:
flag = 1
delete.append([i, j])
answer -= k * len(delete)
number -= len(delete)
for p in delete:
map1[p[0]][p[1]] = 0
if number == 0:
break
if flag == 0:
average = answer / number
for i in range(n):
for j in range(m):
if map1[i][j] > 0:
if map1[i][j] > average:
map1[i][j] -= 1
if map1[i][j] == 0:
number -= 1
answer -= 1
elif map1[i][j] < average:
map1[i][j] += 1
answer += 1
time += 1
print(answer)
'알고리즘 풀이 > 백준 알고리즘' 카테고리의 다른 글
백준 알고리즘 14501번 퇴사 풀이 With Python (0) | 2020.04.26 |
---|---|
백준 알고리즘 새로운 게임2 풀이 With Python (0) | 2020.03.10 |
백준 알고리즘 17825번 주사위 윷놀이 풀이 With Python (0) | 2020.03.10 |
백준 알고리즘 13458번 시험 감독 풀이 With Python (0) | 2020.03.09 |
백준 알고리즘 3190번 뱀 풀이 With Python (0) | 2020.03.09 |
Comments