알고리즘/문제

[그리디] - S3_2012_등수매기기

Casteira 2023. 5. 15. 00:42

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

 

2012번: 등수 매기기

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

www.acmicpc.net

 

📌 - 처음 생각한 풀이

  1. 예상 등수를 정렬
  2. 1씩 증가하면서 예상 등수랑 차이를 더함

 

- 풀이가 분명히 맞다고 생각해서 제출을 했는데 틀림

- 숫자를 보니 50만까지 증가할 수 있는데 최악의 경우 에상등수와 실제 등수의 차이가 최대치로(ex - 예상등수 50만등, 실제 1등) 날 경우가 50만개 있는 경우 int타입을 벗어나서 틀리게 됨

 

📌- 풀이

  1. 예상 등수를 정렬
  2. 1씩 증가하면서 에쌍 등수랑 차이를 더 함
  3. 결과 값의 자료형을 long으로 선언

앞으로 시간 복잡도, 메모리 초과, 자료형을 더욱 확실하게 판단할 필요가 있을 것 같다.

 

🔥 - Java 코드

 

package S3_2012_등수매기기;

import java.io.*;
import java.util.*;

public class Main {
        public static int n;
        public static long count;
        public static int[] arr;

    public static void main(String[] args) throws IOException {
        //BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedReader br = new BufferedReader(new FileReader("src/input.txt"));
        StringTokenizer st = new StringTokenizer(br.readLine());


        n = Integer.parseInt(st.nextToken());
        count =0;
        arr = new int[n];
        for(int i=0;i<n;i++){
            arr[i] = Integer.parseInt(br.readLine());
        }
        Arrays.sort(arr);

        for(int i=0;i<n;i++){
            count += Math.abs((i+1)-arr[i]);
        }

        System.out.println(count);



    }

}