
게임맵 최단거리
프로그래머스 / 게임맵 최단거리 / Level 2
- 전형적인 BFS 2차원 배열 문제.
- BFS는 가까운 노드 (여기선 칸)부터 방문하므로, 시작점으로부터 모든 칸까지의 최소거리를 구할 수 있음.
- 이때 시작 칸도 거리(이동한 칸 수)에 포함됨에 유의
- 시간 복잡도: N행 M열일 때, 모든 칸을 방문하면 O(N×M)
from collections import deque
def solution(maps):
N = len(maps)
M = len(maps[0])
visited = [[-1] * M for _ in range(N)]
visited[0][0] = 1
queue = deque([(0, 0)])
dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]
while queue:
cx, cy = queue.popleft()
for i in range(4):
nx, ny = cx + dx[i], cy + dy[i]
if 0 <= nx < N and 0 <= ny < M and maps[nx][ny] == 1 and visited[nx][ny] == -1:
queue.append((nx, ny))
visited[nx][ny] = visited[cx][cy] + 1
return visited[-1][-1]
체육복
프로그래머스 / 체육복 / Level 1
- 체육복을 잃어버린 학생들은 리스트
lost로
- 체육복을 빌려줄 수 있는 학생들은 집합
reserve_set으로 관리
- 단, 여벌체육복을 가져온 학생이 체육복을 잃어버렸을 수 있음
- 이 경우 자기 체육복을 입을 순 있지만, 빌려줄 순 없음. 즉
reserved_set, lost 양쪽에 존재하면 안 됨에 유의할 것.
lost를 순회하면서 앞사람이 체육복을 가져왔는지 확인. 없으면 뒷사람이 가져왔는지 확인.
- 시간 복잡도:
lost의 길이가 N reserve의 길이가 M일 때
reserve_set, lost를 계산하며 O(N+M)
lost를 순회하면서 O(N)
def solution(n, lost, reserve):
fail = 0
reserve_set = set(reserve) - set(lost)
lost = list(set(lost) - set(reserve))
for l in lost:
if (l - 1) in reserve_set:
reserve_set.remove(l - 1)
elif (l + 1) in reserve_set:
reserve_set.remove(l + 1)
else:
fail += 1
return n - fail
최빈값 구하기
프로그래머스 / 최빈값 구하기 / Level 0
- 풀이법이 다양할 것 같은데, 나는
Counter의 most_common 메서드 사용함.
Counter(리스트 등 이터러블)로, 이터러블의 각 원소의 빈도를 셈
- 이후
.most_common(k)로 제일 많이 등장한 k개의 원소를, (원소값, 빈도수)]의 형태로 반환
- e.g.,
k=2일 때, [1, 2, 3, 3, 3, 4] -> [(3, 3), (1, 1)]
- e.g.,
k=2일 때, [1, 1, 2, 2] -> [(1, 2), (2, 2)]
- e.g.,
k=2일 때, [1] -> [(1, 1)]
- 반환리스트를
num_counts로 둘 때, 아래 세 가지로 경우가 나뉨
- 리스트 내 값의 종류가 1개뿐인 경우,
new_counts[0][0]
- 리스트 내 값의 종류가 2개인 경우,
new_counts[0][1]과 new_counts[1][1]을 비교
- 동일하면 최빈값이 2개이므로, -1 반환
- 다른 경우 최빈값이 1개이므로,
new_counts[0][0] 반환
- 시간 복잡도:
array의 원소가 N개일 때, 카운터 만들면서 O(N). .most_common에선 내부적으로 정렬이 이루어지므로, O(NlogN). 최종 O(NlogN)
from collections import Counter
def solution(array):
num_counts = Counter(array).most_common(2)
if len(num_counts) == 1 or num_counts[0][1] != num_counts[1][1]:
return num_counts[0][0]
else:
return -1