분류 전체보기

문제 링크 https://www.acmicpc.net/problem/9461 9461번: 파도반 수열 오른쪽 그림과 같이 삼각형이 나선 모양으로 놓여져 있다. 첫 삼각형은 정삼각형으로 변의 길이는 1이다. 그 다음에는 다음과 같은 과정으로 정삼각형을 계속 추가한다. 나선에서 가장 긴 변의 www.acmicpc.net 문제 문제 풀이 문제에서 주어진 예제만으로 점화식이 쉽게 구해진 문제였다. P[1], P[2], P[3]까지는 모두 1의 값을 가지고 n이 4부터 100까지의 값일 경우 P[n] = p[n - 3] + p[n - 2] 의 점화식을 가진다. 즉, 수열에서 2개 전, 3개 전 숫자끼리 더한 값이 현재 값이다. p = [0 for i in range(101)] p[1] = 1 p[2] = 1 p[..
문제 링크 https://www.acmicpc.net/problem/1699 1699번: 제곱수의 합 어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다 www.acmicpc.net 문제 문제 풀이 i가 현재 숫자, j가 i보다 작은 제곱수들일 때, dp[i - j] 중 가장 최소항의 개수가 작은 것을 찾아낸다. 이 값에 1을 더해주면 i의 최소항의 개수가 나타난다. (1을 더해주는 이유는 제곱수에 대한 항의 수를 추가하기 위해서이다.) 점화식 => dp[i] = min(dp[i - j]) + 1 n = int(input())..
문제 링크 https://www.acmicpc.net/problem/2579 2579번: 계단 오르기 계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. 과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점 www.acmicpc.net 문제 문제 풀이 전형적인 DP 방식으로 풀리는 문제이다. 주의해야 할 점은 현재 계단(i), 바로 아래 계단을 오를 경우 두 계단을 연속으로 올랐기 때문에 i - 3까지의 최댓값에 두 계단의 값을 더해야 한다는 점이다! n = int(input()) array = [0] * 300 for i in range(n): array[i] = int(input()) dp = [0] * 300 dp[0] = ..
문제 링크 https://www.acmicpc.net/problem/2156 2156번: 포도주 시식 효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규 www.acmicpc.net 문제 문제 풀이 포도주가 한 개, 두 개 주어졌을 경우는 별다른 계산 필요없이 첫 번째를 선택하는 경우, 첫 번째 + 두 번째를 선택하는 경우가 최대이다. 세 개 주어졌을 경우에는 (1번 + 3번), (2번 + 3번), (1번 + 2번 [두 개 주어졌을 때의 최댓값) 중 최대의 값을 선택하게 된다. 4개부터 n개의 포도주가 주어졌을 때를 보면, 1) n번째 선택 + (n - 1)번째 선택..
문제 링크 https://www.acmicpc.net/problem/9465 9465번: 스티커 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의 www.acmicpc.net 문제 설명 문제 풀이 0 1 2 3 4 0 50 10 100 20 40 1 30 50 70 10 60 이 문제는 패턴이 잘 눈에 띄지 않아서 어려웠는데, 결과적으로 굉장히 간단한 패턴을 찾을 수 있다. 예를 들어, dp[0][2]를 선택하고 싶을 경우 앞에서는 dp[1][0] 혹은 dp[1][1]을 선택해야 하는데 둘 중 큰 것을 선택해야만 한다. dp[1][2]를 선택하고 ..
문제 링크 https://www.acmicpc.net/problem/1463 1463번: 1로 만들기 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. www.acmicpc.net 문제 설명 문제 풀이 Dynamic Programming 문제이다. dp 테이블에 모든 원소를 0으로 초기화시켜준 후 하나씩 반복하여 계산을 하는 것이다. DP는 처음에는 이해가 잘 안되는데 생각해보면 간단하다. 예를 들어 4에 대한 연산의 결과를 생각해보자. 4는 4 -> 2 -> 1 의 연산을 하게된다. 그런데 이걸 하나씩 매번 해줄 필요가 없다. 2에 대한 연산의 횟수(DP(2))에 2를 도출해낸 연산(나누기 2) 한 번(+1)을 카운트해주면 DP[4] = DP[2] + 1이 된다. 이와 같은 ..
문제 링크 https://www.acmicpc.net/problem/11718 11718번: 그대로 출력하기 입력이 주어진다. 입력은 최대 100줄로 이루어져 있고, 알파벳 소문자, 대문자, 공백, 숫자로만 이루어져 있다. 각 줄은 100글자를 넘지 않으며, 빈 줄은 주어지지 않는다. 또, 각 줄은 공백으로 시 www.acmicpc.net 문제 설명 문제 풀이 입력 받은 대로 바로 출력할 수 있어야 한다. 입력이 없을 경우 프로그램을 끝내기 위해 EOF(End Of File)로 예외처리를 해주어 break를 걸어준다. while True: try: print(input()) except EOFError: break
신장 트리 하나의 그래프가 있을 때 모든 노드를 포함하면서 사이클이 존재하지 않는 부분 그래프 크루스칼 알고리즘 신장 트리 중에서 최소 비용으로 만들 수 있는 신장 트리를 찾는 알고리즘을 '최소 신장 트리 알고리즘'이라고 하는데 대표적인 최소 신장 트리 알고리즘이 '크루스칼 알고리즘'이다. 최소 신장 트리는 일종의 트리 자료구조이므로, 최종적으로 신장 트리에 포함되는 간선의 개수가 '노드의 개수 - 1'과 같다는 특징이 있다. 크루스칼 알고리즘은 그리디 알고리즘으로 분류된다. [알고리즘] 1) 간선 데이터를 비용에 따라 오름차순으로 정렬한다. 2) 간선을 하나씩 확인하며 현재의 간선이 사이클을 발생시키는지 확인한다. 1. 사이클이 발생하지 않는 경우 최소 신장 트리에 포함시킨다. 2. 사이클이 발생하는 ..
YOONJELLY
'분류 전체보기' 카테고리의 글 목록 (17 Page)