Wing Pointer - Text Select

[BOJ] 2012 - λ“±μˆ˜ λ§€κΈ°κΈ°

2025. 7. 16. 21:36ㆍProblem Solving/Online Judge

클릭 μ‹œ ν•΄λ‹Ή 문제둜 이동

 

πŸ’¬ 문제 μ„€λͺ…

Nλͺ…μ˜ 학생이 "λ‚˜λŠ” β—‹λ“± ν•˜κ³  μ‹Άμ–΄μš”!"라고 μ˜ˆμƒ λ“±μˆ˜λ₯Ό μ œμΆœν•œλ‹€. ν•˜μ§€λ§Œ λͺ¨λ“  ν•™μƒμ˜ μ˜ˆμƒμ΄ λ“€μ–΄λ§žμ„ μˆ˜λŠ” μ—†λ‹€.

각 ν•™μƒμ˜ μ˜ˆμƒ λ“±μˆ˜μ™€ μ‹€μ œ λ“±μˆ˜ κ°„μ˜ 차이의 총합을 μ΅œμ†Œν™”ν•˜λ„λ‘ ν•™μƒλ“€μ—κ²Œ μ‹€μ œ λ“±μˆ˜λ₯Ό λΆ€μ—¬ν•˜μž.

 

πŸ“Œ 주의 사항

  • 학생 수 N: 1 ≤ `N` ≤ 500,000
  • μ˜ˆμƒ λ“±μˆ˜: 1 이상 `N` μ΄ν•˜μ˜ μ •μˆ˜
  • 좜λ ₯: ν•™μƒλ“€μ˜ μ˜ˆμƒ λ“±μˆ˜μ™€ μ‹€μ œ λ“±μˆ˜μ˜ 차이의 μ΄ν•©μ˜ μ΅œμ†Ÿκ°’

 


πŸ‘Œ 문제 풀이

이 λ¬Έμ œλŠ” Greedy(νƒμš• μ•Œκ³ λ¦¬μ¦˜)둜 ν•΄κ²°ν•  수 μžˆλ‹€.

 

 ν•΅μ‹¬ 아이디어

  • μ •λ ¬ν•œ μ˜ˆμƒ λ“±μˆ˜μ™€ 1λ“±λΆ€ν„° μ°¨λ‘€λ‘œ λΆ€μ—¬ν•˜λŠ” μ‹€μ œ λ“±μˆ˜λ₯Ό λ§€μΉ­ν•΄μ„œ 차이의 총합을 μ΅œμ†Œν™”ν•  수 μžˆλ‹€.
  • 예λ₯Ό λ“€μ–΄ μ˜ˆμƒ λ“±μˆ˜κ°€ [1, 2, 2, 6]이라면,
    μ •λ ¬ ν›„ [1, 2, 2, 6]와 [1, 2, 3, 4]λ₯Ό λΉ„κ΅ν•œλ‹€.

 


πŸ’» μ½”λ“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class λ“±μˆ˜λ§€κΈ°κΈ° {
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int N = Integer.parseInt(br.readLine());
        int[] array = new int[N];
        
        for (int i = 0; i < N; i++) {
            array[i] = Integer.parseInt(br.readLine());
        }
        
        Arrays.sort(array);  // μ˜ˆμƒ λ“±μˆ˜ μ •λ ¬
        
        long result = 0;  // 총 λΆˆλ§Œλ„λŠ” 맀우 클 수 μžˆμœΌλ―€λ‘œ long μ‚¬μš©
        
        for (int i = 0; i < N; i++) {
            result += Math.abs(array[i] - (i + 1));  // μ˜ˆμƒλ“±μˆ˜ - μ‹€μ œλ“±μˆ˜
        }
        
        System.out.println(result);
    }
}

🧠 회고

❌ ν‹€λ ΈμŠ΅λ‹ˆλ‹€

⚠️ 주의 사항: int vs long
  • λ¬Έμ œμ—μ„œ N이 μ΅œλŒ€ 500,000μ΄λ―€λ‘œ,
    μ΅œμ•…μ˜ 경우 (500,000 - 1)^2 = μ•½ 2.5 * 10^11κΉŒμ§€ 총합이 컀질 수 μžˆλ‹€.
  • `int`의 λ²”μœ„λŠ” μ•½ ±21μ–΅ (-2,147,483,648 ~ 2,147,483,647)
  • λ”°λΌμ„œ `int result = 0`으둜 μž‘μ„±ν•˜λ©΄ μ˜€λ²„ν”Œλ‘œμš° λ°œμƒ κ°€λŠ₯ → ν‹€λ¦° λ‹΅ 좜λ ₯
  • λ°˜λ“œμ‹œ `long result = 0`으둜 μ„ μ–Έν•΄μ•Ό ν•œλ‹€!

 

μ²˜μŒμ—” μ˜ˆμƒ λ“±μˆ˜ λ°°μ—΄κ³Ό 1 ~ N의 μ‹€μ œ λ“±μˆ˜λ₯Ό λ‹¨μˆœνžˆ 맞좰보면 λ˜μ§€ μ•Šμ„κΉŒ ν–ˆμ§€λ§Œ
정렬을 톡해 κ°€μž₯ κ°€κΉŒμš΄ λ“±μˆ˜λΌλ¦¬ λ§€μΉ­ν•˜λŠ” 것이 κ°€μž₯ λΆˆλ§Œμ„ 쀄일 수 μžˆλŠ” λ°©λ²•μ΄λΌλŠ” κ±Έ κΉ¨λ‹¬μ•˜λ‹€.
λ˜ν•œ 문제 μžμ²΄λŠ” μ‰¬μ› μ§€λ§Œ int둜 합계λ₯Ό κ³„μ‚°ν•˜λ©΄ ν‹€λ¦° 정닡이 λ‚˜μ˜€λŠ” μ˜ˆμ™Έλ₯Ό λ§Œλ‚˜μ„œ
μžλ£Œν˜•μ˜ κΈ°λ³Έ κ°œλ…μ˜ μ€‘μš”μ„±μ„ λ‹€μ‹œ ν•œλ²ˆ λŠλ‚„ 수 μžˆμ—ˆλ‹€.

 


βœ… 배운 점

  • Greedy μ•Œκ³ λ¦¬μ¦˜μ˜ κΈ°λ³Έ μ „λž΅: "μ •λ ¬ ν›„ 순차 λ§€μΉ­"
  • μžλ£Œν˜• μ„ νƒμ˜ μ€‘μš”μ„± ≫ 연산이 컀질 수 μžˆλŠ” λˆ„μ ν•© λ¬Έμ œμ—μ„œλŠ” `long` κ³ λ €ν•˜κΈ°!
  • 문제의 쑰건(N의 λ²”μœ„ λ“±)은 λ‹¨μˆœν•œ 정보가 μ•„λ‹ˆλΌ μžλ£Œν˜• κ²°μ •μ˜ κ·Όκ±°κ°€ 될 수 있음