본문 바로가기

백준 & 알고리즘

(17)
[파이썬] 백준 1108번 - 검색 엔진 https://www.acmicpc.net/problem/1108 티어: 플래티넘 3 로직 A에서 B로, B에서 A로 통하는 링크가 없을 때만 점수를 더하기에, 그래프를 SCC 단위로 분리합니다. 이후, 위상 정렬을 하며 각 웹사이트별 점수를 계산해주면 쉽게 답이 나옵니다.
[파이썬] 백준 1471번 - 사탕 돌리기 https://www.acmicpc.net/problem/1471 티어: 플래티넘 4 로직 흔한 다른 SCC 문제와는 다르게, 문제에서 딱히 그래프라고 주어진게 없습니다. 그래프 먼저 만들어야 문제가 쉬워집니다. 먼저, n + 1 크기의 1차원 정수 배열 graph를 만들고, 0으로 초기화합니다. graph[a]는 a번 칸에 있을 때, 다음으로 방문할 칸의 번호를 나타냅니다. 1부터 n+1까지 for문을 돌리며 graph 값을 지정해줍니다. 만들어진 그래프를 SCC 단위로 분리해줍니다. 다음으로, n + 1 크기의 1차원 정수 배열 dp를 만들고, -1로 초기화합니다. dp[a]는 a번 칸에서 방문할 수 있는 칸의 최대 개수를 의미합니다. 크기가 2 이상의 SCC 안에 포함되는 칸은 dp값을 그 SCC의..
[파이썬] 백준 26157번 - 즉흥 여행 (Hard) https://www.acmicpc.net/problem/26157 티어: 플래티넘 3 로직 하나의 SCC 안에 들어있는 나라들은 서로 자유롭게 이동할 수 있으므로, 하나의 노드로 생각할 수 있습니다. 먼저, 주어진 그래프를 SCC 단위로 분리합니다. 분리된 SCC의 개수가 1개라면 아무데서나 출발해도 됩니다. indegree가 0인 SCC의 개수가 1개이고, 해당 scc에서 모든 노드를 방문할 수 있으면 해당 scc가 정답이 됩니다. indegree가 0인 SCC의 개수가 2개 이상이고, 모든 노드를 방문할 수 없다면 정답은 0이 됩니다.
[파이썬] 백준 3682번 - 동치 증명 https://www.acmicpc.net/problem/3682 티어: 플래티넘 2 로직 문제를 바꿔 생각해보면, 주어진 그래프를 딱 하나의 SCC로 만들기 위해 추가해야할 간선의 최소 개수가 정답이 됩니다. 간선의 최소 개수는 indegree가 0인 scc의 수, outdegree가 0인 scc의 수 중 큰 수 입니다. 원래 그래프가 하나의 SCC였다면, 0을 출력하도록 따로 처리해줘야 합니다.
[파이썬] 백준 4013번 - ATM https://www.acmicpc.net/problem/4013 티어: 플래티넘 2 로직 어떤 교차로와, 그 교차로가 속한 SCC 안의 교차로는 자유롭게 움직일 수 있으므로, SCC 단위로 돈을 구해줘야 합니다. SCC를 추출한 뒤, SCC 단위로 위상 정렬을 하며 SCC에 도달할 때까지 출금할 수 있는 최대 금액 + 그 SCC에서 출금할 수 있는 금액을 저장합니다.. 시작 지점이 정해져 있으므로 시작 지점에서 도달할 수 없는 곳은 따로 표시해줍니다. 시작 지점에서 출발해 도달할 수 있는 곳중 출금할 수 있는 금액이 문제의 답이 됩니다.
Top-down DP와 Bottom-up DP의 차이점과 장단점, 쓰는 경우 Top-down DP와 Bottom-up DPDP를 푸는 방식에는 크게 두 가지 스타일이 있다고 할 수 있습니다.첫 번째는, Top-down DP로, 큰 부분부터 작은 부분으로 쪼개지며 답을 찾습니다.두 번째는 Bottom-up DP로, 작은 부분부터 시작해 큰 부분까지 모두 답을 찾습니다. 단순히 구현 방법의 차이라고만 생각할 수도 있겠지만, 의외로 성능 차이가 나는 부분이 있습니다. Top-down DP의 이점Top-down DP가 훨씬 유리한 경우가 있습니다. 모든 부분을 다 구하지 않아도 될 때인데, 백준 무한 수열 문제처럼, 수열의 모든 항을 다 구하지 않아도 될 때는 Top-down 방식이 훨씬 유리합니다. Bottom-up DP는 문제를 해결하는 데 있어 필요하지 않은 부분까지 모두 구하다 ..
[파이썬] 백준 1111번 - IQ Test 풀이 https://www.acmicpc.net/problem/1111 티어: 골드 3 로직 N개의 수들을 lst라는 리스트에 저장합니다. 1. lst가 한 가지의 수로만 이루어졌으며 N이 1이 아닐 때([1, 1, 1, 1] 등)는 lst[0]이 답이 됩니다. 2. N이 2보다 작을 때는 A가 답이 됩니다 3. [1, 1, 2], [2, 2, 2, 1] 등 같이 같은 수가 반복되다가 또 다른 숫자가 나온다면 B가 답이 됩니다. ([2, 1, 1, 1]같이 반복되는 수가 맨 뒤에 있는 수열은 앞수 * 0 + 1로 표현 가능합니다.) 4. 수열의 규칙은 lst[i+1] = lst[i] * a + b 형태로 표현 가능합니다 수열에서 lst[0], lst[1], lst[2]를 이용해 a * lst[0] + b = ..
[파이썬] 백준 1354번 - 무한 수열 2 풀이 https://www.acmicpc.net/problem/1354 티어: 골드 5 로직 수열 A의 모든 값을 구할 필요가 없으므로 탑다운 방식을 사용합니다. 수열 A는 dp 변수에 딕셔너리 형태로 저장하며, 초기값으로 A[0] = 1이 되도록 설정해줍니다. 수열 A의 i번째 값을 구하는 A(i)라는 함수를 만들어봅시다. 맨 처음, dp[i]값이 이미 저장되어 있는지 확인하고, 저장되어 있다면 그 값을 반환합니다. A[i]에서 i가 0 이하의 값이라면 1이므로 i의 를 max(0, i)로 설정해줍니다. A(i//p - x)와 A(i//q - y)의 값을 재귀적으로 구하고, 둘을 더한 값을 dp[i]에 저장하고 반환합니다. 구하고, 둘을 더한 값을 dp[i]에 저장하고 반환합니다.