728x90
https://school.programmers.co.kr/learn/courses/30/lessons/250136
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
처음에는 이중 for 문을 열부터 돌아주면서 방문리스트를 초기화하면서 진행하려고 했고, 테스트 케이스는 다 통과했으나 최적화 부분에서 실패 > deque의 popleft() 사용으로 시간복잡도를 줄였는데도 최적화 통과를 못해서 로직 자체를 손봐야한다는걸 깨달았다.
bfs처리를 통해 각 열에 영향을 주는 석유덩어리를 미리 만들어두고, 석유덩어리가 영향을 주는 열을 set으로 만들어서 중복을 처리하고 순회하면서 결과값 집합에 size를 더해주었다.
코드
from collections import deque
def solution(land):
n, m = len(land), len(land[0])
visited = [[False] * m for _ in range(n)]
result = [0] * m
def getOil(si, sj):
di = [0, 1, -1, 0]
dj = [1, 0, 0, -1]
q = deque()
q.append((si, sj))
visited[si][sj] = True
size = 1
affect_col = {sj}
while q:
ci, cj = q.popleft()
for k in range(4):
ni = ci + di[k]
nj = cj + dj[k]
if 0 <= ni < n and 0 <= nj < m and not visited[ni][nj] and land[ni][nj] == 1:
visited[ni][nj] = True
size += 1
q.append((ni, nj))
affect_col.add(nj)
for col in affect_col:
result[col] += size
# 열 이동하면서 시추작업 시작
for j in range(m):
for i in range(n):
if not visited[i][j] and land[i][j] == 1:
getOil(i, j)
return max(result)'알고리즘 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스] 가장 큰 수 (Python) lambda, sorted functool.cmp_to_key (0) | 2025.02.06 |
|---|---|
| [프로그래머스] 옹알이 (1) (JS) 정규식RegExp (1) | 2025.01.31 |
| [프로그래머스] 롤케이크 자르기(Python) (0) | 2024.06.27 |
| [프로그래머스] 등굣길(Python) (0) | 2024.06.24 |