CodingTest/Java

BOJ_2217 : λ‘œν”„

Soom_1n 2022. 10. 11. 10:44

πŸ‘‰ 문제링크

 

2217번: λ‘œν”„

N(1 ≤ N ≤ 100,000)개의 λ‘œν”„κ°€ μžˆλ‹€. 이 λ‘œν”„λ₯Ό μ΄μš©ν•˜μ—¬ 이런 μ €λŸ° 물체λ₯Ό λ“€μ–΄μ˜¬λ¦΄ 수 μžˆλ‹€. 각각의 λ‘œν”„λŠ” κ·Έ κ΅΅κΈ°λ‚˜ 길이가 λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— λ“€ 수 μžˆλŠ” 물체의 μ€‘λŸ‰μ΄ μ„œλ‘œ λ‹€λ₯Ό μˆ˜λ„ μžˆλ‹€. ν•˜

www.acmicpc.net



πŸ”Έ 문제 뢄석 πŸ”Έ

  • μž…λ ₯받은 λ‘œν”„λ‘œ λ“€ 수 μžˆλŠ” μ΅œλŒ€ μ€‘λŸ‰μ„ 좜λ ₯ν•œλ‹€.
  • μ΅œλŒ€ μ€‘λŸ‰μ€ κ°€μž₯ μ•½ν•œ λ‘œν”„ * λ‘œν”„μ˜ 개수 이닀.

πŸ”Έ μ½”λ“œ πŸ”Έ

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 br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int arr[] = new int[n];
        for (int i = 0; i < n; i++){
            arr[i] = Integer.parseInt(br.readLine());
        }
        Arrays.sort(arr);
        int answer = 0;
        for (int i = n-1; i >= 0; i--){
            int temp = arr[i] * (n-i);
            if (temp > answer) answer = temp;
        }
        System.out.println(answer);
    }
}

πŸ”Έ μ½”λ“œ 해석 πŸ”Έ

  • n이 μ΅œλŒ€ 100,000이고 각 λ‘œν”„μ˜ μ€‘λŸ‰μ€ μ΅œλŒ€ 10,000 μ΄λ―€λ‘œ, μ΅œλŒ€ μ€‘λŸ‰μ˜ μ΅œλŒ€κ°’μ€ 100,000 * 10,000 = 1,000,000,000 (10μ–΅)이닀. λ”°λΌμ„œ int(μ΅œλŒ€ 20μ–΅)λ₯Ό μ‚¬μš©ν•΄λ„ λœλ‹€.
  • 문제의 μ œν•œμ‹œκ°„μ€ 2초이고, μ΅œμ†Œκ°’μ„ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
    • 맀번 μ΅œμ†Œκ°’μ„ κ΅¬ν•΄μ€˜μ•Ό ν•˜λ©΄, O(n^2) == 10,000,000,000으둜 100μ–΅νšŒ κ³„μ‚°μœΌλ‘œ μ•½ 100μ΄ˆκ°€ μ†Œμš”λœλ‹€.
    • λ”°λΌμ„œ μ΅œμ†Œκ°’μ„ λ”°λ‘œ ꡬ해쀄 ν•„μš”κ°€ 없도둝 μ •λ ¬ν›„ λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ κ³„μ‚°ν•œλ‹€.
  • μ˜€λ¦„μ°¨μˆœ μ •λ ¬ ν›„ μ΅œλŒ€κ°’μ„ μ°ΎλŠ” λ°˜λ³΅λ¬Έμ„ λ’€μͺ½μœΌλ‘œ μˆœνšŒν•œλ‹€.
    • μ •λ ¬ν–ˆμœΌλ―€λ‘œ 인덱슀 i둜 λ‚˜μ˜€λŠ” 값은 항상 μ΅œμ†Œκ°’μ΄λ‹€.
    • (μ΅œμ†Œκ°’ * λ‘œν”„μ˜ 개수)의 μ΅œλŒ€κ°’μ„ 좜λ ₯ν•œλ‹€.

πŸ”Έ end πŸ”Έ

  • 문제λ₯Ό 잘λͺ» νŒŒμ•…ν•˜κ³  DFSλ₯Ό μ‚¬μš©ν•΄μ•Όν•˜λ‚˜ ν•œμ°Έ κ³ λ―Όν–ˆλ‹€.
  • 문제 νƒœκ·Έκ°€ μ •λ ¬, 그리디인걸 λ³΄κ³ μ„œμ•Ό 풀이λ₯Ό νŒŒμ•…ν•  수 μžˆμ—ˆλ‹€.
    • answer의 μžλ£Œν˜•μ„ 일단 long으둜 두고 λ§žμ•˜λŠ”λ°, κ³„μ‚°ν•΄λ³΄λ‹ˆ intλ‘œλ„ κ°€λŠ₯ν•΄μ„œ λ°”κΏ”μ£Όμ—ˆλ‹€.
    • μ •λ ¬ν–ˆμœΌλ―€λ‘œ (μ΅œμ†Œκ°’ * λ‘œν”„μ˜ 개수)κ°€ ν•œ λ²ˆμ΄λΌλ„ answer보닀 μž‘μœΌλ©΄ λ’€λŠ” κ²€μ‚¬ν•˜μ§€ μ•Šμ•„λ„ λ˜λŠ” 쀄 μ•Œμ•˜λ‹€.
      • (μ΅œμ†Œκ°’)이 λ„ˆλ¬΄ μž‘μ•„μ„œ μΌμ‹œμ μœΌλ‘œ 더 μž‘κ²Œ λ‚˜μ˜¬ 수 μžˆμ§€λ§Œ, (λ‘œν”„μ˜ 개수)κ°€ 컀지며 λ‹€μ‹œ μ΅œλŒ€κ°’μ΄ κ°±μ‹  될 수 μžˆμœΌλ―€λ‘œ μ „λΆ€ 확인해야 ν•œλ‹€.
  • ν˜Ήμ‹œ 풀이 초점이 ν‹€λ Έμ„κΉŒ ν•΄μ„œ λ‹€λ₯Έ 풀이듀을 ν™•μΈν•΄λ΄€μ—ˆμ§€λ§Œ, μœ„μ˜ μ΄μœ λ•Œλ¬Έμ— ν‹€λ¦°κ±°μ˜€λ‹€.

728x90