5052, 2470, 1202 (백준)

김태성·2021년 11월 25일

5052 전화번호 목록

전화번호 목록이 주어진다. 이때, 이 목록이 일관성이 있는지 없는지를 구하는 프로그램을 작성하시오.

전화번호 목록이 일관성을 유지하려면, 한 번호가 다른 번호의 접두어인 경우가 없어야 한다.

예를 들어, 전화번호 목록이 아래와 같은 경우를 생각해보자

긴급전화: 911
상근: 97 625 999
선영: 91 12 54 26
이 경우에 선영이에게 전화를 걸 수 있는 방법이 없다. 전화기를 들고 선영이 번호의 처음 세 자리를 누르는 순간 바로 긴급전화가 걸리기 때문이다. 따라서, 이 목록은 일관성이 없는 목록이다.

입력
첫째 줄에 테스트 케이스의 개수 t가 주어진다. (1 ≤ t ≤ 50) 각 테스트 케이스의 첫째 줄에는 전화번호의 수 n이 주어진다. (1 ≤ n ≤ 10000) 다음 n개의 줄에는 목록에 포함되어 있는 전화번호가 하나씩 주어진다. 전화번호의 길이는 길어야 10자리이며, 목록에 있는 두 전화번호가 같은 경우는 없다.

출력
각 테스트 케이스에 대해서, 일관성 있는 목록인 경우에는 YES, 아닌 경우에는 NO를 출력한다.


import sys
input = sys.stdin.readline

T = int(input())
for _ in range(T):
    # 입력
    N = int(input())
    N_list = [];
    # 일관성 검사를 위한 변수
    consistency = True
    
    # 리스트 입력
    for n in range(N):
        N_list.append(input())
    N_list.sort(key=len) # 정렬
    
    # 불안한 2중 for문...
    # 길이별로 정렬된 문자열들을 차례로 나머지들을 검사한다
    for i in range(N-1):
        i_len = len(N_list[i])-1
        
        for d in range(i+1,N):
            if N_list[i][0:i_len] == N_list[d][0:i_len]:
                consistency = False
                
    print("NO" if consistency==False else "YES")
    

시간초과 발생

2470 두 용액

KOI 부설 과학연구소에서는 많은 종류의 산성 용액과 알칼리성 용액을 보유하고 있다. 각 용액에는 그 용액의 특성을 나타내는 하나의 정수가 주어져있다. 산성 용액의 특성값은 1부터 1,000,000,000까지의 양의 정수로 나타내고, 알칼리성 용액의 특성값은 -1부터 -1,000,000,000까지의 음의 정수로 나타낸다.

같은 양의 두 용액을 혼합한 용액의 특성값은 혼합에 사용된 각 용액의 특성값의 합으로 정의한다. 이 연구소에서는 같은 양의 두 용액을 혼합하여 특성값이 0에 가장 가까운 용액을 만들려고 한다.

예를 들어, 주어진 용액들의 특성값이 [-2, 4, -99, -1, 98]인 경우에는 특성값이 -99인 용액과 특성값이 98인 용액을 혼합하면 특성값이 -1인 용액을 만들 수 있고, 이 용액이 특성값이 0에 가장 가까운 용액이다. 참고로, 두 종류의 알칼리성 용액만으로나 혹은 두 종류의 산성 용액만으로 특성값이 0에 가장 가까운 혼합 용액을 만드는 경우도 존재할 수 있다.

산성 용액과 알칼리성 용액의 특성값이 주어졌을 때, 이 중 두 개의 서로 다른 용액을 혼합하여 특성값이 0에 가장 가까운 용액을 만들어내는 두 용액을 찾는 프로그램을 작성하시오.

입력
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,000,000 이하이다. N개의 용액들의 특성값은 모두 다르고, 산성 용액만으로나 알칼리성 용액만으로 입력이 주어지는 경우도 있을 수 있다.

출력
첫째 줄에 특성값이 0에 가장 가까운 용액을 만들어내는 두 용액의 특성값을 출력한다. 출력해야 하는 두 용액은 특성값의 오름차순으로 출력한다. 특성값이 0에 가장 가까운 용액을 만들어내는 경우가 두 개 이상일 경우에는 그 중 아무것이나 하나를 출력한다.

  • 처음에 이걸 어케하나 싶었지만 생각보다 쉬웠다
  • 절대값을 비교해가며 0에 가까워 질 때 까지 이분탐색을 반복한다
import sys
input = sys.stdin.readline

N = int(input())
N_list = list(map(int, input().split()))
N_list.sort()

left = 0
right = N-1
result = N_list[left] + N_list[right]
tmp_left = left
tmp_right = right

while left < right:
    check = N_list[left] + N_list[right]
    if abs(check) < abs(result):
        result = check
        tmp_left = left
        tmp_right = right
        if result == 0:
            break
    if check < 0:
        left += 1
    else:
        right -= 1

print(N_list[tmp_left], N_list[tmp_right])

    

1202 보석

세계적인 도둑 상덕이는 보석점을 털기로 결심했다.

상덕이가 털 보석점에는 보석이 총 N개 있다. 각 보석은 무게 Mi와 가격 Vi를 가지고 있다. 상덕이는 가방을 K개 가지고 있고, 각 가방에 담을 수 있는 최대 무게는 Ci이다. 가방에는 최대 한 개의 보석만 넣을 수 있다.

상덕이가 훔칠 수 있는 보석의 최대 가격을 구하는 프로그램을 작성하시오.

입력
첫째 줄에 N과 K가 주어진다. (1 ≤ N, K ≤ 300,000)

다음 N개 줄에는 각 보석의 정보 Mi와 Vi가 주어진다. (0 ≤ Mi, Vi ≤ 1,000,000)

다음 K개 줄에는 가방에 담을 수 있는 최대 무게 Ci가 주어진다. (1 ≤ Ci ≤ 100,000,000)

모든 숫자는 양의 정수이다.

출력
첫째 줄에 상덕이가 훔칠 수 있는 보석 가격의 합의 최댓값을 출력한다.

  • 보석에 대한 정보를 받을 때 보석 크기를 기준으로 우선순위 큐에 넣어준다.
  • 가방도 마찬가지로 크기에 대한 기준으로 우선순위 큐에 넣어준다.
  • 가방을 우선순위 큐에서 heappop해서 cur_bag 변수에 넣어준다.
  • cur_bag의 값보다 작거나 같은 보석들을 모두 pop해서 temp 리스트에 보석 가격을 기준으로 heappush 해준다.
  • 위 작업이 끝나면 temp에서 가장 가격이 높은 보석을 뽑기 위해 heappop해준다.
import sys, heapq
readlines = sys.stdin.readline

N, K = map(int, input().split())

jewelrys = []
bags = []

for n in range(N):
    heapq.heappush(jewelrys, list(map(int, readlines().split())))

for k in range(K):
    heapq.heappush(bags, int(readlines()))

result = 0
temp = []
while bags:
    cur_bag = heapq.heappop(bags)

    while jewelrys and cur_bag >= jewelrys[0][0]:
        cur_jewelry = heapq.heappop(jewelrys)
        heapq.heappush(temp, -cur_jewelry[1])

    if temp:
        result += -heapq.heappop(temp)

print(result)
profile
@flip_404

0개의 댓글