프롬프트-
해당 문제의 링크를 줄테니 문제를 읽고 다음과 같이 정리
- 문제를 한 줄로 요약
- 문제의 조건을 기재하고, 어떤 부분이 중요한지도 체크
- 문제의 유형이 뭐고, 이 문제를 풀 때 핵심이 되는 키워드
- 내 코드의 개선점, 향후 개선점 (정답 코드 및 지금까지 나눈 대화를 이력으로 작성해줘)
모든 답안은 짧고 간결하게 줄글과 들여쓰기 형식으로 기재.
제곧내. 최소 스패닝 트리를 구현하는 문제.
get_parent 함수를 반복하다보면 재귀 제한이 걸릴 수도 있음.# 일반적인 get_parent
def get_parent(x):
if parent[x] != x:
parent[x] = get_parent(parent[x])
return parent[x]
# 경로 압축
def get_parent(x):
curr = x # x의 부모를 일단 먼저 구함
while parent[curr] != curr:
curr = parent[curr]
# 여기가 핵심! 지나가는 길목을 쫙 다 부모(curr)로 깔아버림
while parent[x] != curr:
nxt = parent[x]
parent[x] = curr
x = nxt
return curr
명의 학생이 각자의 집에서 목적지 에 갔다가 다시 자기 집으로 돌아오는 경로 중, 가장 오래 걸리는 학생의 소요 시간을 구하는 문제.
자기 집으로 돌아가는 거야 목적지 X에서 다익스트라를 돌리면 될 일이지만, N명이 학생이 각자 출발지에서 X로 가는 가장 빠른 '최단 거리'를 구하는 방식을 어떻게 구하는지 관건이다. 일반적인 다익스트라 문제인 줄 알았으나, 시간을 획기적으로 줄이는 '역방향 그래프'에 대한 단서가 숨겨져 있던 문제. 일반적인 거리 정보를 담은 리스트 roads와 이를 거꾸로 담은 rev_roads를 만들고, X에서 다익스트라를 출발하면 오히려 각자 출발해 X에 도착할 때 가장 빠른 경로가 저장된다는 충격적인 사실...
본래 방법은 명의 학생이 있을 때 번 다익스트라를 돌려야 했겠지만, 이 방식대로라면 단 2번만에 값을 구할 수 있다.
주어진 정수 n에 세 가지 연산을 적절히 사용하여 1을 만드는 데 필요한 최소 연산 횟수를 구하는 문제
자연수 이 주어졌을 때, 하나 이상의 연속된 소수의 합으로 을 나타낼 수 있는 경우의 수를 구하는 문제
sum(prime[start:end+1])로 합을 구했지만, 실제로는 굉장히 위험한 방식이다. 연속합을 만드는게 베스트.# 슬라이싱 일괄 대입
for i in range(2, n+1):
if is_prime[i]:
prime.append(i)
is_prime[i*i : n+1 : i] = [False] * len(range(i*i, n+1, i))
# 예시: 0부터 10까지 리스트에서 2의 배수 자리를 모두 False로 바꾸기
nums = [True] * 11
# 인덱스 4, 6, 8, 10 (2의 배수들) 선택
nums[4:11:2] = [False] * 4
# 결과: [True, True, True, True, False, True, False, True, False, True, False]
방향 그래프가 주어졌을 때, 시작 노드에서 다른 모든 노드로 가는 최단 경로의 길이를 각각 구하는 문제
모든 간선의 가중치는 10 이하의 자연수 (음수 가중치가 없으므로 다익스트라 사용 가능)
서로 다른 두 정점 사이에 여러 개의 간선이 존재할 수 있음에 유의해야 합니다. (최단으로 갱신해줘야 함)
N개의 도시와 M개의 버스 노선이 주어질 때, 특정 출발 도시에서 도착 도시까지 가는 최소 버스 비용을 계산하는 문제
visited()로 한 번 간 곳은 다시 안 가기 때문에 최소 비용 갱신이 불가능한 BFS (X)# 코스트를 먼저 높은 수로 다 채워 놓고
cost = [1e9 for _ in range(n+1)]
# 시작점에서 출발 (0으로 잡고)
heapq.heappush(q, (0, start))
cost[start] = 0
# 이후 heapq 돌면서 하나씩 제끼면 된다
while q:
c1, now = heapq.heappop(q)
# 애초에 들어온 값이 아예 커버리면 계산도 패스
if cost[now] < c1:
continue
# 지금 경로 + 앞으로 갈 경로가 더 작으면 갱신
for c2, next in graph[now]:
c = c1 + c2
if c < cost[next]:
cost[next] = c
heapq.heappush(q, (c, next))
print(cost[end])
N*3 격자 위에서 인접한 칸으로만 이동하며 내려갈 때, 얻을 수 있는 점수의 최댓값과 최솟값을 구하는 문제
sys.stdin.readline()을 때려박아야 한다. (10배나 줄어드는 상황)
빈칸을 백트래킹으로 쫓아가면서 하나씩 값을 넣어보고, 아니면 뒤로 돌아가는 문제.
row_check = [[False] * 10 for _ in range(9)]
col_check = [[False] * 10 for _ in range(9)]
box_check = [[False] * 10 for _ in range(9)]
정렬된 정수 배열에서 두 수를 더해 0에 가장 가까운 조합을 찾는 문제
1e9로 설정하면 큰일남! (이보다 더 클 수 있다)float('inf')로 설정할 것.3차원 공간의 개 행성을 최소 비용으로 모두 연결하는 문제
보드판에서 인접한 8방향의 알파벳을 연결하여 주어진 단어 사전(최대 30만 개)에 존재하는 단어를 찾아 점수, 최장 단어, 찾은 단어 개수를 출력하는 문제.
return하는 게 아니라 계속 탐색해서 더 긴 단어를 놓치면 안됨.모든 도시 쌍() 사이의 최단 거리를 구하는 전형적인 플로이드-워셜 알고리즘 문제
min() 함수는 함수 호출 오버헤드가 있다. 차라리 이럴 때는 if 문을 사용하는 것이 실행 시간 단축에 도움이 된다.
(묘하게 빨라졌다)
직사각형 보드 안에 빨간 구슬과 파란 구슬을 두고, 보드를 상하좌우로 기울여 빨간 구슬만 구멍(O)을 통해 빼내는 최소 횟수를 구하는 시뮬레이션 문제
while board[y + dy][x + dx] != '#' and board[y][x] != 'O':퇴사 전까지 남은 일 동안, 각기 다른 상담 시간과 보상을 고려하여 얻을 수 있는 최대 수익을 설계하는 문제
dp[i]를 i번째 날까지 얻을 수 있는 최대 수익으로 정의하는 것이 중요