티스토리 뷰
< 문제 링크 >
import collections
import sys
input = sys.stdin.readline
n, l, r = list(map(int, input().split()))
graph = [list(map(int, input().split())) for _ in range(n)]
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
cnt = 0
while True:
visited = [[0] * n for _ in range(n)]
flag = True
# 인구 이동 한 세트
for m in range(n):
for v in range(n):
if visited[m][v] == 0:
queue = collections.deque([(m, v)])
visited[m][v] = 1
# (m, v) 기준으로 연합 구하기
temp = [(m, v)]
while queue:
i, j = queue.pop()
for z in range(4):
nx = i + dx[z]
ny = j + dy[z]
if 0 <= nx < n and 0 <= ny < n and visited[nx][ny] == 0:
if l <= abs(graph[i][j] - graph[nx][ny]) <= r:
queue.appendleft((nx, ny))
visited[nx][ny] = 1
temp.append((nx, ny))
# 연합에 대해서 그래프 값 갱신하기
if len(temp) > 1:
flag = False
meanv = sum([graph[i][j] for i, j in temp]) // len(temp)
for i, j in temp:
graph[i][j] = meanv
if flag: # 더 이상 인구 이동이 없으면
break
cnt += 1
print(cnt)
< 시간 초과 해결 방법 >
- visited 방문 배열을 not in 연산자로 방문 여부 체크하면 O(n) 만큼 걸림
-> 방문 배열을 행렬 그래프로 만들어서 좌표로 O(1)만에 체크 할 수 있도록 해서 시간 초과 문제 해결함
'Algorithm > Impressive Solution' 카테고리의 다른 글
[백준 2206] 벽 부수고 이동하기_ 파이썬(Python) 풀이 방법/테스트 케이스 공유 (0) | 2022.02.07 |
---|---|
[백준 1655] 가운데를 말해요(Python) 우선순위 큐 풀이 방법 (0) | 2021.02.17 |
[백준 15683] 감시 (lev.gold-5) (0) | 2021.01.27 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 익명자식객체
- 클래스와객체
- 객체지향개념
- 자바스크립트Call-back
- jre
- yarn start
- 자바빌드도구
- 백준
- os
- nunjucks
- 인스턴스멤버
- java
- 메이븐 저장소
- jdk
- 자바스레드
- nodejs
- es6모듈
- dynamic-project
- ES6
- method와 function
- 생성자필드메소드
- 정적멤버
- 자바스크립트Promise
- sequelize.fn
- @functools.wraps
- 사용자정의예외클래스
- Git
- @functools.singledispatch
- 백준2206 파이썬 풀이
- @functools.lru_cache
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함