도비LOG(跳飛錄)

도비의 AI 엔지니어 도전기

알고리즘 47

[백준 1789] 수들의 합 (실버 5) Python

https://www.acmicpc.net/problem/1789 1789번: 수들의 합 첫째 줄에 자연수 S(1 ≤ S ≤ 4,294,967,295)가 주어진다. www.acmicpc.net 문제 서로 다른 N개의 자연수의 합이 S라고 한다. S를 알 때, 자연수 N의 최댓값은 얼마일까? 입력 첫째 줄에 자연수 S(1 ≤ S ≤ 4,294,967,295)가 주어진다. 출력 첫째 줄에 자연수 N의 최댓값을 출력한다. 풀이 방법 서로 다른 n개의 자연수를 더해서 s를 만들어야 한다. 이때 더하는 자연수의 종류를 가장 많이 갖는 경우를 구해야 한다. n의 최댓값을 구하려면 작은 수부터 차례로 더해서 s를 만드는 방법을 찾아야 한다. 1부터 s까지 for문을 돌면서, s-1, s-2... 를 반복하다가 s가 ..

알고리즘 2023.04.19

[백준 1463] 1로 만들기 (실버 3) Python

https://www.acmicpc.net/problem/1463 1463번: 1로 만들기 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. www.acmicpc.net 문제 정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다. X가 3으로 나누어 떨어지면, 3으로 나눈다. X가 2로 나누어 떨어지면, 2로 나눈다. 1을 뺀다. 정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오. 입력 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. 출력 첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다. 접근 방법 주어진 수를 1로 만드려면 '3으로 나누기 > 2로 나누기 > 1..

알고리즘 2023.04.18

[백준 9095] 1, 2, 3 더하기 (실버 3) Python

https://www.acmicpc.net/problem/9095 9095번: 1, 2, 3 더하기 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다. www.acmicpc.net 문제 정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다. 1+1+1+1 1+1+2 1+2+1 2+1+1 2+2 1+3 3+1 정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 11보다 작다. 출력 각 테스트 케이스마다, n을 1, 2, 3의 ..

알고리즘 2023.04.18

[백준] 11866 요세푸스 문제 0

https://www.acmicpc.net/problem/11866 11866번: 요세푸스 문제 0 첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 1,000) www.acmicpc.net 문제 요세푸스 문제는 다음과 같다. 1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, K)-요세푸스 순열이라고 한다. 예를 들어 (7, 3)-요세푸스 순열은 이다. N과 K가 주어지면 (N, K)-요세푸스 순열을 구하는 프로그램..

알고리즘 2023.04.17

[백준] 10866 덱 (실버 4) Python

https://www.acmicpc.net/problem/10866 10866번: 덱 첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 www.acmicpc.net 문제 정수를 저장하는 덱(Deque)를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오. 명령은 총 여덟 가지이다. push_front X: 정수 X를 덱의 앞에 넣는다. push_back X: 정수 X를 덱의 뒤에 넣는다. pop_front: 덱의 가장 앞에 있는 수를 빼고, 그 수를 출력한다. 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다. p..

알고리즘 2023.04.17

[백준] 최소비용 구하기 (골드 5) Python

https://www.acmicpc.net/problem/1916 접근 방법 N을 정점, M을 간선으로 하는 그래프를 그릴 수 있다. 또한 '버스 비용'이라는 가중치가 존재하는 그래프다. 즉, 가능한 경로 중에서 가중치의 합이 가장 적은 경로를 찾는 문제이다. 문제의 조건을 보면 '버스 비용이 0보다 크거나 같다'라는 힌트가 있다. 이는 다익스트라 알고리즘을 쓰기 위한 전제조건인 '가중치가 음수가 아니어야 한다.'라는 조건과 같은 말이다. 결국, 이 문제는 다익스트라 알고리즘으로 풀 수 있다. 자세한 풀이 과정은 다음과 같다. 1. n+1 길이의 그래프(graph)를 그려준다. 2. 거리(가중치) 정보를 기록할 n+1 길이의 리스트 distance를 선언해준다. 이때 각 요소의 값은 모두 매우 큰 수인 ..

알고리즘 2023.04.16

[백준] 빗물 (Gold 5) Python 풀이

https://www.acmicpc.net/problem/14719 14719번: 빗물 첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500) 두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치 www.acmicpc.net 풀이 "물은 어디에 고이는가?"에 대해 고민해 봐야 한다. 물은 움푹 패인 곳에 고인다. 움푹 패였다는 것은, 양 옆의 지형이 현재 위치의 지형보다 높게 형성되었다는 것이다. 즉, 이러한 조건을 만족할 때 물이 고인다고 할 수 있다. 그리고 "물은 얼마큼 고이는가?"에 대해서도 고민해 봐야 한다. 예를 들어 현재 위치가 3이고, 왼쪽에서 가장 높은 2번 위치의 높이가 4이고, 오..

알고리즘 2023.04.16