티스토리 뷰

https://www.acmicpc.net/problem/2012

 

2012번: 등수 매기기

첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 500,000) 둘째 줄부터 N개의 줄에 걸쳐 각 사람의 예상 등수가 순서대로 주어진다. 예상 등수는 500,000 이하의 자연수이다.

www.acmicpc.net

1. 문제

 

 

 

2. 정답 코드

import sys

n = int(input())
data = []
for _ in range(n) :
    data.append(int(sys.stdin.readline()))

data.sort() # 오름차순 정렬

unhappy = [abs(x - (i+1)) for i, x in enumerate(data) ]
answer = sum(unhappy)

print(answer)
  1. 최소 불만을 구하는 방법은 오름차순 정렬된 등수에 실제 등수를 빼는 것이다.
  2. 예상 등수 입력 시 시간 초과가 나지 않으려면, input() 대신 더 빠른 입력처리가 가능한 sys.stdin.readline() 사용해야 한다.
  3. (i+1)번째 학생의 불만도는 (i + 1)번째 학생의 예상 등수 x에서 실제 등수인 (i+1)을 뺀 값이다.
  4. 각 불만도의 합, 즉 sum(unhappy)가 정답이다.

 

  • 이때 List Comprehension 사용하는 방법 대신 아래와 같이 코드를 작성할 수도 있다.
# List Comprehension 대신 아래 코드도 가능
answer = 0
for i, x in enumerate(data) :
	answer += abs(x - (i+1))
728x90