[11501] 주식 (최대 이익 구하기)
·
Coding Test/Geedy
11501번: 주식 입력의 첫 줄에는 테스트케이스 수를 나타내는 자연수 T가 주어진다. 각 테스트케이스 별로 첫 줄에는 날의 수를 나타내는 자연수 N(2 ≤ N ≤ 1,000,000)이 주어지고, 둘째 줄에는 날 별 주가를 나타 www.acmicpc.net 분석 뒤에서부터 현재 주가와 최대 주가 비교 최대주가와 현재 주가의 차이 더하기 (사고 팔 때 가격 차이) 총 합은 최대이익 풀이 """ 주식 하나를 산다. 원하는 만큼 가지고 있는 주식을 판다. 아무것도 안한다. 예를 들어 날 수가 3일이고 날 별로 주가가 10, 7, 6일 때, 주가가 계속 감소하므로 최대 이익은 0이 된다. 그러나 만약 날 별로 주가가 3, 5, 9일 때는 처음 두 날에 주식을 하나씩 사고, 마지막날 다 팔아 버리면 이익이 10이..
[2217] 로프 (최대 중량 구하기)
·
Coding Test/Geedy
2217번: 로프 N(1 ≤ N ≤ 100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다. 하 www.acmicpc.net 풀이 """ k개의 로프를 사용하여 중량이 w인 물체를 들어올릴 때, 각각의 로프에는 모두 고르게 w/k 만큼의 중량이 걸리게 된다. 이 로프들을 이용하여 들어올릴 수 있는 물체의 최대 중량을 구해내는 프로그램 첫째 줄에 정수 N이 주어진다. 다음 N개의 줄에는 각 로프가 버틸 수 있는 최대 중량이 주어진다. 2 10 15 """ n=int(input()) w=[] for _ in range(n): w.append(int(input())) w.sort(..
[11000] 강의실 배정
·
Coding Test/Geedy
11000번: 강의실 배정 첫 번째 줄에 N이 주어진다. (1 ≤ N ≤ 200,000) 이후 N개의 줄에 Si, Ti가 주어진다. (0 ≤ Si < Ti ≤ 109) www.acmicpc.net 풀이 """ 김종혜 선생님한테는 Si에 시작해서 Ti에 끝나는 N개의 수업이 주어지는데, 최소의 강의실을 사용해서 모든 수업을 가능하게 해야 한다. 참고로, 수업이 끝난 직후에 다음 수업을 시작할 수 있다. (즉, Ti ≤ Sj 일 경우 i 수업과 j 수업은 같이 들을 수 있다.) 첫 번째 줄에 N이 주어진다. (1 ≤ N ≤ 200,000) 이후 N개의 줄에 Si, Ti가 주어진다. (0 ≤ Si < Ti ≤ 109) 3 1 3 2 4 3 5 """ import heapq import sys input=sys..
[2457] 공주님의 정원
·
Coding Test/Geedy
2457번: 공주님의 정원 첫째 줄에는 꽃들의 총 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 각 꽃이 피는 날짜와 지는 날짜가 주어진다. 하나의 날짜는 월과 일을 나타내는 두 숫자로 표현된다. 예를 들어서, www.acmicpc.net 분석 N개의 꽃들 중에서 3월 1일부터 11월 30일까지 매일 꽃이 한 가지 이상 피어 있도록 꽃들을 선택할 때, 선택한 꽃들의 최소 개수를 출력 풀이 import sys input=sys.stdin.readline n = int(input()) f = [] for i in range(n): sm,sd,em,ed=map(int, input().split()) f.append([sm*100+sd, em*100+ed]) f.sort() start..
[1026] 보물
·
Coding Test/Geedy
1026번: 보물 첫째 줄에 N이 주어진다. 둘째 줄에는 A에 있는 N개의 수가 순서대로 주어지고, 셋째 줄에는 B에 있는 수가 순서대로 주어진다. N은 50보다 작거나 같은 자연수이고, A와 B의 각 원소는 100보다 작거 www.acmicpc.net 분석 A 배열 가장 큰 값 * B 배열 가장 작은 값으로 정렬하여 더하기 B에 있는 수 재배열 불가하지만 최솟값 출력이므로 무방 풀이 """ 길이가 N인 정수 배열 A와 B가 있다. 다음과 같이 함수 S를 정의하자. S = A[0]×B[0] + ... + A[N-1]×B[N-1] S의 값을 가장 작게 만들기 위해 A의 수를 재배열하자. 단, B에 있는 수는 재배열하면 안된다. S의 최솟값을 출력 5 1 1 1 6 0 2 7 8 3 1 """ import ..
[1744] 수 묶기 ( 수를 묶어서 최댓값 만들기, 우선순위 큐)
·
Coding Test/Geedy
1744번: 수 묶기 길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에 www.acmicpc.net 분석 양수 : 가능한 큰 수들끼리 묶음 음수: 음수끼리 곱해서 양수로 더함 0 : 음수가 남는경우 0을 곱함 1 : 다 더함 풀이 import sys input=sys.stdin.readline from queue import PriorityQueue pq = PriorityQueue() # 양수처리 mq = PriorityQueue() # 음수처리 one=0 zero=0 n=int(input()) for _ in range(n): data=int(input(..