n = int(input())
data = []
for _ in range(n):
data.append(int(input()))
data.sort()
if len(data) == 1:
print(data[0])
exit()
result = 0
result += data[0] * (len(data) - 1)
for i in range(1, len(data)):
result += data[i] * (len(data) - i)
print(result)
최초 코드
import heapq
n = int(input())
data = list(int(input()) for _ in range(n))
heapq.heapify(data) # heapify를 통해 기존 리스트를 heap으로 변환
result = 0
while len(data) != 1:
num1 = heapq.heappop(data)
num2 = heapq.heappop(data)
result += num1 + num2
heapq.heappush(data, num1 + num2)
print(result)
최종 코드
최종 코드 제출
최초에는 데이터 값들의 연속성을 발견하여
n
n - 1 / n - 1
n - 1 / n - 1 / n - 2
n - 1 / n - 1 / n - 2 / n -3
n - 1 / n - 1 / n - 2 / n - 3 / n - 4
.....................
을 기본항으로 문제를 풀어보려 했으나
우리가 구해야하는건 최소의 값
즉 데이터를 정렬해서 제일 작은 두 항을 묶고, 그 항을 다시 리스트의 맨 앞으로 불러들여
또 다시 제일 작은 두 항을 묶어야 하는 문제였다 ( 1개가 남을 때 까지 )
원래는 heap을 사용하지 않고, list를 사용하여 풀려 했었다
pop(0)를 사용하여 x = pop(0), y = pop(0), data.append(x+y)
count = 1
while True:
l, p, v = map(int, input().split())
if l == p == v == 0:
break
result = (v // p) * l
if v - (v // p) * p < l:
result += v - (v // p) * p
else:
result += l
print("Case %d:" %count, result)
count += 1
테스트 케이스가 많다보니 sys로 input = sys.stdin.readline 해주지 않으면 시간 초과가 발생했다.
import sys
input = sys.stdin.readline
for _ in range(int(input())):
n = int(input())
data = []
count = 1
for _ in range(n):
data.append(list(map(int, input().split())))
data.sort()
tmp = data[0][1]
for i in range(1, n):
if tmp > data[i][1]:
count += 1
tmp = data[i][1]
print(count)
서류와 면접중 한 점수를 기준으로 오름차순 정렬을 한 뒤
총 5명의 지원자 일 경우
서류 점수가 1등인 자의 면접 점수가 4일 경우
면접점수가 4보다 아래인 사람은 자동으로 탈락이다.
이런식으로 반복을 더해나가며 문제를 해결했다.
물론 처음부터 문제를 해결할 수 있었던건 아니였다.
for _ in range(int(input())):
n = int(input())
data = []
count = 0
for _ in range(n):
data.append(list(map(int, input().split())))
data.sort()
data2 = sorted(data, key= lambda x : x[1])
result = []
for i in range(data[0][1] + 1, n + 1):
result.append(i)
for i in range(data2[0][0] + 1, n + 1):
result.append(data[i - 1][1])
print(n - len(set(result)))
원래는 서류 점수 1등의 면접 점수를 기준으로 그보다 낮은 요소들을
list의 del을 이용해서 제거한 뒤, 남은 인원들의 인원수를 len(data)를 통해 정답을 구하려 했으나
len(data)의 변화를 for 문에서는 초기 len(data)의 값으로만 고정이 된다는 점을 착각하여 index out error가 발생하였다.
그래서 리스트를 서류 기준 / 면접 기준으로 2개로 나누어 풀어보았지만, 역시 시간초과가 발생하였다.
문제를 단순히 보고 직관적으로 해결할 수 있어야 하는데, 자꾸 스스로 어려운 방향으로 나아가는 것 같다.
그래도 솔직히 정형화 된 방법보단, 즉흥적으로 떠오르는 방법으로 딱 풀었을 때 그 손맛이 계속 코드를 두들기게 하는 것 같다.
하지만 내 실력이 쌓일 때 까지는 문제를 파악하고 정확한 해결법을 연상시켜 풀이할 수 있는 PS능력을 기르자!