1 분 소요

문제 목록 바로가기 : https://programmers.co.kr/learn/challenges

섬 연결하기

Link : https://programmers.co.kr/learn/courses/30/lessons/42861

solution

그냥 크루스칼로 풀면 되지 않을까? 라고 시작했는데 모든 섬의 경로를 더할 방법을 떠올리기가 힘들었다.
결론적으로는 최소 스패닝 트리(MST)를 이용했다.
BOJ 1922: 네트워크 연결과 같은 문제.

단속카메라

Link : https://programmers.co.kr/learn/courses/30/lessons/42884

solution

union-find로 해결했다. 되게 간단해 보였지만 머리를 좀 굴려야 했다..
대부분 스위핑 문제가 그렇듯이 시작점과 끝점을 분리해서 정렬하고 시작한다.
시작점만 연달아 나온다면 같은 집합으로 묶는다.
끝점이 나온다면 그 점이 속한 집합이 체크되지 않았다는 가정하에
해당되는 집합을 체크하고 답을 +1, 부모를 초기화한다.

정수 삼각형

Link : https://programmers.co.kr/learn/courses/30/lessons/43105

solution

현재 위치가 \((x, y)\)라면 대각선 왼쪽, 오른쪽은 각각 \((x+1, y), (x+1, y+1)\)이다.
점화식은 다음과 같다.
\(f(x, y) = max(f(x+1, y), f(x+1, y+1)) + triangle[x][y]\)

여행경로

Link : https://programmers.co.kr/learn/courses/30/lessons/43164

solution

맵을 사용하면서 조금 난잡해진 감이 있지만.. 그래도 어떻게 비비다보니 통과했다.
일단 모든 공항이 문자열이므로 이 문자열 자체만으로는 인덱스로 활용할 수가 없어서 맵을 이용했다.
모든 티켓을 사용하는게 목적이므로 티켓에 적힌 공항 정보를 숫자로 매핑시키고 서로 연결한 후
DFS를 통해 모든 이웃으로 이동하도록 했다.
처음에 visited(chk)를 공항 넘버로 각각 설정했는데 자꾸 오류가 떴었다. ㅠㅠ
같은 정보가 든 티켓이 들어있을 수 있기 때문에 그렇다고 한다. 때문에 chk[공항넘버][티켓넘버]로 설정했다.

이중우선순위큐

Link : https://programmers.co.kr/learn/courses/30/lessons/42628

solution

특정 숫자를 삽입, 최대/최솟값 삭제 등의 쿼리를 처리하면 되는 문제.
최대/최솟값을 O(1)만에 찾고 삭제할 수 있으려면 정렬된 상태로 유지해야 한다.
들어오는 값을 이분 탐색해서 넣든 들어올 때마다 정렬을 하든 상관없다.
정렬된 상태만 유지한다면 상관없으므로 set을 이용해 풀었다.

베스트앨범

Link : https://programmers.co.kr/learn/courses/30/lessons/42579

solution

주어진 조건에 맞춰서 정렬을 해서 앨범당 2곡을 담으면 된다.
크게 설명할게 없는 문제.

등굣길

Link : https://programmers.co.kr/learn/courses/30/lessons/42898

solution

단순한 DP 문제다.
이동 가능한 방향, 이동 불가능한 위치들이 정의 돼있으므로
이에 맞춰 이동 가능한 모든 방향을 탐색한다.
범위에서 벗어나는지도 꼭 체크해주자.

보행자 천국

Link : https://programmers.co.kr/learn/courses/30/lessons/1832

solution

현재 위치에 해당되는 값이 2일 때 이전에 향했던 방향을 고려해주면 된다.
이 부분만 제외한다면 간단한 DP문제다. 인자가 3개가 되는게 포인트.

카테고리:

업데이트:

댓글남기기