목록2024/09 (8)
공부 기록장
https://www.acmicpc.net/problem/5557 코드import sysinput = sys.stdin.readlinen = int(input())arr = list(map(int, input().split()))# i번째 숫자까지 저장했을 때, 그 결과가 j일 경우, 가능한 경우의 수 저장하는 DP 테이블dp = [[0] * 21 for _ in range(n-1)]# 첫 번째 수는 무조건 선택해야 함으로, 첫 번째 수(arr[0])로 결과가 만들어 질 수 있는 경우의 수 1로 초기화dp[0][arr[0]] = 1for i in range(1, n-1): for j in range(21): # i-1 번째 수까지 왔을 때 j라는 값을 만들 수 있는 경우의 수가 존재한다..
https://www.acmicpc.net/problem/27966 코드N = int(input())print((N-1) ** 2)for i in range(2, N+1): print(1, i) 애드혹 문제란?문제를 풀기 위해 잘 알려진 정교한 알고리즘을 적용하지 않고도 해결할 수 있는 유형의 문제! 굳이 유형 분류를 하자면, 구현, 그리디, 수학 유형으로 분류할 수 있다.다시 말해, 정형화 된 방법론이 아니라, 창의적인 아이디어를 떠올려야 하는 문제 접근 방식- 노드 사이 거리에 대한 설명이 없으면 1이라고 간주- 모든 노드 쌍의 거리 합을 최소화하기 위해서는 하나의 노드에 다른 모든 노드가 연결된 형태여야 한다- 가운데 노드를 1번 노드라고 한다면, 1번 노드와 나머지 (N-1)개 노드로 가는 ..
https://www.acmicpc.net/problem/14244 코드n, m = map(int, input().split())cnt = 0for i in range(n-1): print(cnt, i+1) # cnt가 n-m 이상이면 cnt는 그대로 유지가 되므로, 리프 노드에 노드들을 이어붙일 수 있게 됨 if n-m > cnt: cnt += 1 접근 방법- 연결을 어떤 식으로 하든, 리프 노드는 최소 2개 이상이다.- n개의 노드 중에서 m개의 노드가 리프 노드이면, n-m개의 노드가 리프 노드가 아니다.- n-m번은 순차적으로 연결을 해주고, 그 이후 연결은 마지막 노드에 전부 연결해 준다. 배운 점- 트리의 최소 리프 노드 개수를 토대로, 어떠한 방식으로 리프 노드를..
https://www.acmicpc.net/problem/17298 코드from collections import dequeimport sysinput = sys.stdin.readlinen =int(input())num = list(map(int, input().split()))ans = [-1] * nstack = deque()for i in range(n): while stack and num[stack[-1]] 접근 방법- 문제 자체는 단순하고 쉬워보이지만, 수열의 크기가 최대 백만일 수 있기 때문에 시간 복잡도를 고려해야 한다- 현재 값을 기준으로 더 큰 값을 '효율적으로' 찾을 방법이 필요하다- 순차적으로 배열을 처리하면서, 특정 조건을 만족하는 경우 값을 처리하는 자료구조로 "스택"을..