본문 바로가기

알고리즘

(368)
[Python] 1562번 계단 수 https://www.acmicpc.net/problem/1562 1562번: 계단 수 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net 23/12/05 비트마스킹을 이용한 DP를 연습하기 좋은 문제이다. 클래스 5에도 있으니, 비트마스킹에 대한 개념을 이해한 뒤에 조금 생각해보고 풀면 더욱 도움이 될 것 같다. 문제 접근 방식: 길이가 매우 긴 자리수를 가지고 있는 특정한 계단 수에 대한 경우의 수를 구하는 문제이다. 계단 수이긴 하지만, $0$부터 $9$까지의 모든 숫자를 써야 한다는 점이 다르다. 즉, 우리는 숫자의 사용 여부를 관리해야 할 필요성이 있다. 그걸 DP 배열에 넣고 관리하기에는 조금 까다로운 면이 있다. 이럴 때 비트마스킹을 이용할 수..
[Python] 27172번 수 나누기 게임 https://www.acmicpc.net/problem/27172 27172번: 수 나누기 게임 《보드게임컵》을 준비하다 지친 은하는 보드게임컵 참가자들을 경기장에 몰아넣고 결투를 시키는 게임 《수 나누기 게임》을 만들었습니다. 《수 나누기 게임》의 규칙은 다음과 같습니다. www.acmicpc.net 23/12/05 기존 에라토스테네스의 체 알고리즘을 응용한 문제로, 정확히 말하면 체의 원리를 이용한 문제여서 조금 신선하다고 할 수 있다. 클래스 5에도 있는 교육적인 문제이니, 안보고 해결하면 좋을 문제인 것 같다. 문제 접근 방식: 어떤 수가 다른 수의 약수가 되면, 그 수는 점수를 얻는 방식이다. 예를 들어 $3$과 $12$가 서로 게임을 한다고하면 $3$은 1점을 얻고 $12$는 1점을 잃는다...
[Python] 17633번 제곱수의 합 (More Huge) https://www.acmicpc.net/problem/17633 17633번: 제곱수의 합 (More Huge) 입력은 표준입력을 사용한다. 입력은 자연수 n을 포함하는 한 줄로 구성된다. 여기서, 1 ≤ n ≤ 1,000,000,000,000,000,000이다. www.acmicpc.net 23/12/05 처음으로 푼 다이아3 문제이다. 높은 수학적 지식을 요구하기 때문에 사실상 혼자 이 문제를 관찰 만을 통해 풀어낸다는 건 불가능에 가깝다고 생각한다. 다만 이 문제에서 요구하는 정수론적 지식을 이미 갖추고 있는 사람이라면 다이아 3이라는 난이도에 비해 쉽게 문제를 해결할 수 있을 것이라고 생각한다. 문제 접근 방식: 먼저, 이 문제는 밀러-라빈 소수 판별법과 폴라드-로 소인수 분해 알고리즘을 구현..
[Python] 5526번 ダーツ (Darts) https://www.acmicpc.net/problem/5526 5526번: ダーツ (Darts) この例では,15 点の部分に 3 本,3 点の部分に 1 本の矢が刺さった場合にあなたの 得点は最大になり,その得点は 48 点である. www.acmicpc.net 23/12/29 중간에서 만나기(MITM) 연습 문제로 아주 적절한 문제이다. 첫번째 문제 접근 방식: 문제를 해석하자면 아래와 같다. 화살을 과녁을 향해 네 자루 던질 수 있다. 반드시 4개를 다 던질 필요는 없으며, 하나도 던지지 않아도 된다. 과녁은 $N$개의 부분으로 구분되어 있으며, 각 부분에는 점수 $P_1, P_2, \cdots , P_N$이 쓰여있다. 화살이 꽃힌 곳의 점수를 모두 합한 값 $S$가 기본 점수가 된다. 만약 $S$가 미리 정해..
[Python] 2295번 세 수의 합 https://www.acmicpc.net/problem/2295 2295번: 세 수의 합 우리가 x번째 수, y번째 수, z번째 수를 더해서 k번째 수를 만들었다라고 하자. 위의 예제에서 2+3+5=10의 경우는 x, y, z, k가 차례로 1, 2, 3, 4가 되며, 최적해의 경우는 2, 3, 4, 5가 된다. k번째 수가 최 www.acmicpc.net 23/12/28 중간에서 만나기(MITM)으로 안 풀어도 집합으로 쉽게 풀 수 있는 문제이다. 나는 중간에서 만나기 알고리즘 연습을 위해 그 방법으로 문제를 해결했다. 첫번째 문제 접근 방식: MITM으로 해결했다. 세 수의 합이 최대가 되도록 하려는 것이 우리의 목적이고, 그 세 수의 합 또한 기존 배열에 존재해야 한다. 나는 두 개로 분할했는데,..
[Python] 9007번 카누 선수 https://www.acmicpc.net/problem/9007 9007번: 카누 선수 이 문제에서는 입력은 표준 입력을 사용한다. 입력의 첫 줄에는 T개의 테스트 케이스가 주어진다. 각 테스트 케이스에는 두 개의 정수 k와 n이 주어지며, k( 1 ≤ k ≤ 40,000,000)는 보트의 특정 값 그 www.acmicpc.net 23/12/27 중간에서 만나기(MITM) 연습 문제로 풀었던 문제이다. 문제 접근 방식: 전체적인 사고 방식은 이전에 풀었던 중간에서 만나기 기본 문제인 7453번 문제와 같다. 이 문제에 대한 해설은 아래와 같다. 2024.01.02 - [알고리즘/백준 문제 풀이] - [Python] 7453번 합이 0인 네 정수 [Python] 7453번 합이 0인 네 정수 https:..
[Python] 11967번 불켜기 https://www.acmicpc.net/problem/11967 11967번: 불켜기 (1, 1)방에 있는 스위치로 (1, 2)방과 (1, 3)방의 불을 켤 수 있다. 그리고 (1, 3)으로 걸어가서 (2, 1)방의 불을 켤 수 있다. (2, 1)방에서는 다시 (2, 2)방의 불을 켤 수 있다. (2, 3)방은 어두워서 갈 수 없으 www.acmicpc.net 23/12/30 BFS 응용 문제로, 생각했던 풀이 방법보다 더 쉬운 방법이 있어서 글을 써본다. 초반 문제 접근 방식: 초반에 접근했던 문제 방식은 BFS를 한 번만 돌도록 하는 방식이었다. 문제를 보면, 특정 방에서 다른 방들의 스위치를 킬 수 있다고 했다. 그리고 스위치가 켜져 있는 방만 출입할 수 있다고 했고, 방에서 방으로 움직일 때에..
[Python] 15573번 채굴 https://www.acmicpc.net/problem/15573 15573번: 채굴 첫째 줄에 N, M, K가 주어진다. (1 ≤ N, M ≤ 1000, 1 ≤ K ≤ N × M) 둘째 줄부터 맨 위의 광물들부터 순서대로 N줄 동안 M개의 광물의 강도 Si, j가 주어진다.(i = 1, 2, ..., www.acmicpc.net 23/12/31 2023년 마지막 날에 해결한 문제로, BFS와 이분 탐색을 섞은 파라메트릭 문제이다. 파라메트릭 서치 연습으로 아주 적절한 문제인 듯 하다. 문제 접근 방식: 문제에서 요구하는 것은 최솟값을 요구하고 있고, 이 값은 특정 값 이상을 넘어가는 최솟값이므로 파라메트릭 서치를 통해 구현할 수 있다. 채굴기의 성능 $D$와 광산의 모습을 입력으로 받아서 BFS를 통..