목록백준 문제풀이 (18)
minhui study
https://www.acmicpc.net/problem/9009 9009번: 피보나치 문제 피보나치 수 ƒK는 ƒK = ƒK-1 + ƒK-2로 정의되며 초기값은 ƒ0 = 0과 ƒ1 = 1 이다. 양의 정수는 하나 혹은 그 이상의 서로 다른 피보나치 수들의 합으로 나타낼 수 있다는 사실은 잘 알려져 있다. www.acmicpc.net 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... 결론적으로 사용하는 피보나치 수가 최소 개수가 되려면 n보다 같거나 작은 피보나치 수 중 가장 큰 피보나치 수를 사용하고, 이를 반복하면 된다. 가령 n=100이면 89를 사용하고, 남은 11에 대해서 8을 사용하고, 또 남은 3에 대해 3을 사용하면 된다. 100 = 3 + 8 + 89 왜 이렇..
https://www.acmicpc.net/problem/11497 11497번: 통나무 건너뛰기 문제 남규는 통나무를 세워 놓고 건너뛰기를 좋아한다. 그래서 N개의 통나무를 원형으로 세워 놓고 뛰어놀려고 한다. 남규는 원형으로 인접한 옆 통나무로 건너뛰는데, 이때 각 인접한 통나무의 www.acmicpc.net 어떻게 통나무를 배열해야 가장 작은 높이차를 만들 수 있을까? 즉 모든 배열 중에서 최대 높이 차이가 최소인 것을 만들어야 한다. 통나무의 높이를 내림차순으로 정렬하면 처음과 맨끝이 만나게 되므로 차이가 많이 나서 안된다. 그러면 해결 방법은 가장 큰 값을 가운데에 놓고 왼쪽 오른쪽 번갈아 가면서 놓으면 된다. 그렇게 되면 서로 인접한 높이 차이가 오름차순이나 내림차순 정렬을 하였을 때 한 개나..
https://www.acmicpc.net/problem/11508 11508번: 2+1 세일 문제 KSG 편의점에서는 과일우유, 드링킹요구르트 등의 유제품을 '2+1 세일'하는 행사를 하고 있습니다. KSG 편의점에서 유제품 3개를 한 번에 산다면 그중에서 가장 싼 것은 무료로 지불하고 나머� www.acmicpc.net 입력 받은 가격들 중 가장 비싼 것들부터 3개씩 묶었을 때 가장 저렴한 가격이 나오므로 내림차순으로 가격을 정렬했을 때 인덱스에서 3을 나누었을 때 나머지가 2인 것들만 가격에 포함시키지 않으면 된다. from sys import stdin n=int(input()) m=list(map(int, stdin.read().split())) m.sort(reverse=True) cost =..
https://www.acmicpc.net/problem/14916 14916번: 거스름돈 첫째 줄에 거스름돈 액수 n(1 ≤ n ≤ 100,000)이 주어진다. www.acmicpc.net 거스름돈을 못주는 경우는 5원보다 적고 2의 배수가 아닌 경우이므로 1원과 3원일때는 거슬러 줄 수 없다. 그리고 가장 최소의 갯수로 거슬러 주어야 하므로 큰 수인 5부터 나누지만 5로 나눈 나머지가 홀수인 경우에는 나머지에서 5원을 더해주어 5원 대신 나머지+5원을 2원으로 거슬러 주면 된다. n = int(input()) o = n % 5 if(n==1 or n==3): result = -1; elif(o%2==0): result=n//5+o//2 else: result=((n//5)-1)+((o+5)//2) p..
https://www.acmicpc.net/problem/14720 14720번: 우유 축제 영학이는 딸기우유, 초코우유, 바나나우유를 좋아한다. 입맛이 매우 까다로운 영학이는 자신만의 우유를 마시는 규칙이 있다. 맨 처음에는 딸기우유를 한 팩 마신다. 딸기우유를 한 팩 마신 후�� www.acmicpc.net 딸기(0) -> 초코(1) -> 바나나(2) -> 딸기(0) 순으로 우유를 먹어야 하기 때문에 특정 변수를 통해 다음에 어떤 우유를 마셔야 하는지 저장해놓은 다음 현재 우유와 비교하여 같은 때만 1씩 증가시켜 최대 우유를 얼마나 마실 수 있는지 구하면 된다. n = int(input()) c = list(map(int, input().split())) max = 0 for i in range(n)..
https://www.acmicpc.net/problem/10162 10162번: 전자레인지 3개의 시간조절용 버튼 A B C가 달린 전자레인지가 있다. 각 버튼마다 일정한 시간이 지정되어 있어 해당 버튼을 한번 누를 때마다 그 시간이 동작시간에 더해진다. 버튼 A, B, C에 지정된 시간은 �� www.acmicpc.net t=int(input()) a = b = c = 0 if t%10 != 0: print(-1) else: a = t // 300 b = (t%300)//60 c = ((t%300)%60)//10 print(a, b, c) #include using namespace std; int main() { // A : 300초, B : 60초, C : 10초 int a, b, c = 0; i..
https://www.acmicpc.net/problem/1138 1138번: 한 줄로 서기 첫째 줄에 사람의 수 N이 주어진다. N은 10보다 작거나 같은 자연수이다. 둘째 줄에는 키가 1인 사람부터 차례대로 자기보다 키가 큰 사람이 왼쪽에 몇 명이 있었는지 주어진다. i번째 수는 0보다 � www.acmicpc.net 키가 작은 사람부터 result에 넣고 0의 갯수로 자신보다 키 큰 사람이 왼쪽에 몇 명 있는지 파악한다. n = int(input()) c = list(map(int, input().split())) # 2100 result=[0 for i in range(n)] # 0000 for i in range(n): a = c[i] cnt = 0 for j in range(n): if cnt..
https://www.acmicpc.net/problem/2529 2529번: 부등호 두 종류의 부등호 기호 ‘’가 k개 나열된 순서열 A가 있다. 우리는 이 부등호 기호 앞뒤에 서로 다른 한 자릿수 숫자를 넣어서 모든 부등호 관계를 만족시키려고 한다. 예를 들어, 제�� www.acmicpc.net 0~9 숫자 중 중복 없이 부등호 기호에 만족하는 문자열을 만들어야 한다. 그리고 0 > 2 < 3 .... 경우 0뒤부터는 조건에 맞지 않으므로 더 이상 숫자를 넣을 필요없이 다른 경우로 넘어가면 된다. 그리고 0부터 시작하므로 가장 첫번째로 완성된 문자열은 최솟값이고 가장 마지막에 만든 문자열이 최댓값이다. 문자열이 생성되는 과정을 설명하자면 첫번째가 0이면 0은 이미 사용했으므로 c[0]을 True값으..