문제

https://www.acmicpc.net/problem/2012
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(bf.readLine());
int[] rank = new int[N];
for (int i = 0; i < N; i++) {
rank[i] = Integer.parseInt(bf.readLine());
}
Arrays.sort(rank);
long complain = 0;
for (int i = 0; i < N; i++) {
int actualRank = i + 1;
if (rank[i] != actualRank) {
complain += Math.abs(actualRank - rank[i]);
}
}
System.out.println(complain);
}
}
풀이 방법
- 등수를 기준으로 내림차순 정렬을 한다.
- 실제 등수를 정렬 후 배열의 인덱스 + 1로 계산한다.
- 입력값인 예상 등수와 실제 등수가 같지 않다면, 그 차이를 불만도
complain
에 더한다.
- 위 과정을 반복해서 총합을 구한다.
핵심 포인트
- 등수를 기준으로 내림차순 정렬을 해야 인덱스와 등수를 일치시켜 불만도의 차이를 계산할 수 있다.
- 불만도는
-
연산 이후에 절대값을 씌워야 한다. 문제에도 명시되어있으니 명심하자.
- 결과
complain
에 대해서는 int가 아닌 long을 사용해야 한다!!! (이 부분에서 1시간 날림)
보완할 점 / 느낀 점
- 짧은 시간 내에 구현을 성공하였으나, 자료형 관련 오류가 발생하여 한참 해맸다.
- 처음에 제출을 했을 때 퍼센트가 안올라가고 바로
틀렸습니다!
문구가 떠서 로직이 잘못된줄 알고 싹 갈아엎고 다른 방식으로 구현하려했다. 그러다가 질문 게시판을 보고 자료형 문제인 것을 깨달았다.
- 문제를 풀 떄 자료형에 대해서도 고려하자.