N = int(input())
weights = [int(input()) for _ in range(N)]
weights.sort(reverse=True) # 내림차순
for i in range(N):
weights[i] = weights[i] * (i+1)
print(max(weights))
문제 접근 방법
- 로프를 병렬로 연결하면 각 로프에는 w/k만큼의 동일한 중량이 걸린다.
- 즉,가장 작은 무게를 들 수 있는 로프가 들 수 있는 질량 * 병렬연결 로프 개수= 최종 무게
- 가장 무거운 무게를 들 수 있는 로프부터 내림차순으로 정렬한다.
처음에는 너무 어렵게 접근해서 복잡하게 생각했다. 그래서 디큐를 활용해 하나씩 빼고 넣고 하려고 했다가 실패했다. 이렇게 단순하게 풀릴지는... 후..
T = int(input())
A, B, C = 0, 0, 0
while T > 0:
if T >= 300:
A = (T // 300)
T = (T % 300)
if (T >= 60) and (T < 300):
B = (T // 60)
T = (T % 60)
if (T < 60):
C = (T // 10)
if (T % 10) == 0:
print("{} {} {}".format(A, B, C))
break
else:
print(-1)
break
특별히 어려운 조건이 없는 문제였다. 최소한의 버튼 클릭 수를 구하기 위해 입력값을 큰 값으로 최대한 나누면 된다. 입력 값이 단위별로 나눌 수 있는 값인지 판단 후 계산을 하고 몫을 출력해주면 된다. 마지막에 10초로 나눴을 때 나머지가 0이 아니면 -1을 출력한다.
def recruit(num, score):
min_interview = score[0][1] # 첫번째 지원자 면접 등수
cnt = 1 # 첫 번째 지원자는 서류점수가 1등이기에 무조건 뽑힘
for i in range(1, num): # 1번 ~ n-1번
if score[i][1] < min_interview: # 뽑히는 경우
min_interview = score[i][1] # 더 높은 등수로 변경
cnt += 1
return cnt
tests = int(input())
for _ in range(tests):
num = int(input())
score = [list(map(int, input().split())) for _ in range(num)]
score.sort(key=lambda x: x[0]) # 서류 시험 등수 오름차순
print(recruit(num, score))
Python3로 제출하면 시간 초과가 나고, pypy로 제출하니 통과가 됐다. for문을 최대로 줄이려고 해 봤지만 다른 방법을 찾기가 쉽지 않았다.
문제 조건
- 다른 모든 지원자와 비교했을 때 서류심사 성적과 면접시험 성적 중 적어도 하나가 다른 지원자보다 떨어지지 않는 자만 선발.
- 즉, 현재 지원자의 서류 성적보다 더 높은 서류 성적을 가진 사람들보다 면접 성적이 높아야 선발된다.
따라서 우선 성적을 '서류 성적순'으로 정렬시킨다. 그리고 가장 높은 서류 성적을 가진 사람은 면접이 낮더라도 무조건 선발된다. 그래서 첫 번째 지원자의 면접 성적을 min_interview에 담고 그 값을 다음 사람들과 비교해나간다.
더 낮은(즉, 더 좋은 면접 성적) 성적을 가진 사람이 있으면 min_interview에 담는다. 그렇게 되면 특정 지원자의 면접시험 성적과 min_interview만 비교해 특정 지원자의 선발 여부를 결정할 수 있게 된다. 왜냐하면 이미 서류 성적순으로 정렬이 됐기에 지나온 지원자들보다 면접 성적만 낮지 않으면 되기 때문이다.