πŸ₯ˆ [Baekjoon / Java] 18353. 병사 λ°°μΉ˜ν•˜κΈ°

μ΄ν•˜μ–€Β·2024λ…„ 7μ›” 14일
0

🐣 λ°±μ€€

λͺ©λ‘ 보기
33/33

문제 μ„€λͺ…


πŸ’‘ Info

λ‚΄μš©

Nλͺ…μ˜ 병사가 λ¬΄μž‘μœ„λ‘œ λ‚˜μ—΄λ˜μ–΄ μžˆλ‹€. 각 λ³‘μ‚¬λŠ” νŠΉμ •ν•œ κ°’μ˜ μ „νˆ¬λ ₯을 λ³΄μœ ν•˜κ³  있으며, 병사λ₯Ό λ°°μΉ˜ν•  λ•ŒλŠ” μ „νˆ¬λ ₯이 높은 병사가 μ•žμͺ½μ— μ˜€λ„λ‘ λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ 배치λ₯Ό ν•˜κ³ μž ν•œλ‹€. λ‹€μ‹œ 말해 μ•žμͺ½μ— μžˆλŠ” λ³‘μ‚¬μ˜ μ „νˆ¬λ ₯이 항상 λ’€μͺ½μ— μžˆλŠ” 병사보닀 λ†’μ•„μ•Ό ν•œλ‹€.

λ˜ν•œ 배치 κ³Όμ •μ—μ„œλŠ” νŠΉμ •ν•œ μœ„μΉ˜μ— μžˆλŠ” 병사λ₯Ό μ—΄μ™Έμ‹œν‚€λŠ” 방법을 μ΄μš©ν•œλ‹€. κ·ΈλŸ¬λ©΄μ„œλ„ λ‚¨μ•„μžˆλŠ” λ³‘μ‚¬μ˜ μˆ˜κ°€ μ΅œλŒ€κ°€ λ˜λ„λ‘ ν•˜κ³  μ‹Άλ‹€.

예λ₯Ό λ“€μ–΄, N=7일 λ•Œ λ‚˜μ—΄λœ λ³‘μ‚¬λ“€μ˜ μ „νˆ¬λ ₯이 λ‹€μŒκ³Ό κ°™λ‹€κ³  κ°€μ •ν•˜μž.

이 λ•Œ 3번 병사와 6번 병사λ₯Ό μ—΄μ™Έμ‹œν‚€λ©΄, λ‹€μŒκ³Ό 같이 λ‚¨μ•„μžˆλŠ” λ³‘μ‚¬μ˜ μˆ˜κ°€ λ‚΄λ¦Όμ°¨μˆœμ˜ ν˜•νƒœκ°€ 되며 5λͺ…이 λœλ‹€. μ΄λŠ” λ‚¨μ•„μžˆλŠ” λ³‘μ‚¬μ˜ μˆ˜κ°€ μ΅œλŒ€κ°€ λ˜λ„λ‘ ν•˜λŠ” 방법이닀.

병사에 λŒ€ν•œ 정보가 μ£Όμ–΄μ‘Œμ„ λ•Œ, λ‚¨μ•„μžˆλŠ” λ³‘μ‚¬μ˜ μˆ˜κ°€ μ΅œλŒ€κ°€ λ˜λ„λ‘ ν•˜κΈ° μœ„ν•΄μ„œ μ—΄μ™Έν•΄μ•Ό ν•˜λŠ” λ³‘μ‚¬μ˜ 수λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

πŸ“₯μž…λ ₯ 쑰건

  • 첫째 쀄에 N이 주어진닀. (1 ≀ N ≀ 2,000)
  • λ‘˜μ§Έ 쀄에 각 λ³‘μ‚¬μ˜ μ „νˆ¬λ ₯이 곡백을 κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„λ˜μ–΄ μ°¨λ‘€λŒ€λ‘œ 주어진닀.
  • 각 λ³‘μ‚¬μ˜ μ „νˆ¬λ ₯은 10,000,000보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.
7
15 11 4 8 5 2 4

πŸ“€μΆœλ ₯ 쑰건

  • 첫째 쀄에 λ‚¨μ•„μžˆλŠ” λ³‘μ‚¬μ˜ μˆ˜κ°€ μ΅œλŒ€κ°€ λ˜λ„λ‘ ν•˜κΈ° μœ„ν•΄μ„œ μ—΄μ™Έν•΄μ•Ό ν•˜λŠ” λ³‘μ‚¬μ˜ 수λ₯Ό 좜λ ₯ν•œλ‹€.
2


문제 이해


  • μ—΄μ™Έν•΄μ•Όν•˜λŠ” λ³‘μ‚¬μ˜ 수λ₯Ό 계산 -> λ‚¨μ•„μžˆλŠ” λ³‘μ‚¬μ˜ μˆ˜κ°€ μ΅œλŒ€κ°€ 되게!
    • μ „νˆ¬λ ₯이 높은 병사가 μ•žμͺ½μ— 였게 λ‚΄λ¦Όμ°¨μˆœ 배치
    • νŠΉμ •ν•œ μœ„μΉ˜μ— μžˆλŠ” 병사λ₯Ό μ—΄μ™Έμ‹œν‚€λŠ” 방법을 이용, κ·ΈλŸ¬λ©΄μ„œλ„ λ³‘μ‚¬μ˜ μˆ˜κ°€ μ΅œλŒ€κ°€ λ˜λ„λ‘ ν•˜κΈ°


μ•Œκ³ λ¦¬μ¦˜


μ‹€μ œ 풀이 μ‹œκ°„ : 12λΆ„

  • μž…λ ₯

    • N μž…λ ₯λ°›κΈ°
    • 병사 번호, μ „νˆ¬λ ₯ λ°°μ—΄ μž…λ ₯λ°›κΈ°
  • 계산

    • d둜 ν…Œμ΄λΈ” μ΄ˆκΈ°ν™”ν•˜κΈ°
    • λ‚΄λ¦Όμ°¨μˆœ μ •λ ¬ν•˜κΈ°
    • λ°”ν…€μ—…μœΌλ‘œ κ΅¬ν˜„
      • Math.max둜 μ΅œλŒ€ λ³‘μ‚¬μ˜ 수 κ΅¬ν˜„
      • 전체 - μ—΄μ™Έ 병사 수둜 좜λ ₯
  • 좜λ ₯

    • μ „μ²΄μ—μ„œ μ΅œλŒ€κ°’ μ œκ±°ν•΄μ„œ κ²°κ³Ό 좜λ ₯
import java.util.*;

public class Main {

    static int N;
    static int[] d;
    static int maxSol;
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);

        N = sc.nextInt();

        Integer[] arr = new Integer[N];
        for(int i=0; i<N; i++){
            arr[i] = sc.nextInt();
        }

        Arrays.sort(arr, Collections.reverseOrder());

        d = new int[N];
        Arrays.fill(d, 1);

        for(int i = 1; i<N; i++){
            for(int j = 0; j< i; j++) {
                if(arr[j] > arr[i]){
                    d[i] = Math.max(d[i], d[j]+1);
                }
            }
        }

        for(int i=0; i<N; i++){
            maxSol = Math.max(maxSol, d[i]);
        }
        System.out.println(N - maxSol);

    }
}


μ˜€λ‹΅μ²΄ν¬


  • 정렬을 ν•˜κ³  λ‚˜μ„œ 계산을 μ§„ν–‰ν•˜λ‹ˆ 문제 λ°œμƒ
    • μ •λ ¬ μ œκ±°ν•˜κ³ , λ°”λ‘œ Arrays.fill μ§„ν–‰ν•˜λ„λ‘ ν•΄ ν•΄κ²°
//before
Arrays.sort(arr, Collections.reverseOrder());

d = new int[N];
Arrays.fill(d, 1);
//after
d = new int[N];
Arrays.fill(d, 1);


μ΅œμ’… 풀이


μ‹€μ œ 풀이 μ‹œκ°„ : 20λΆ„(첫 풀이 μ‹œκ°„ 포함)

  • μž…λ ₯

    • N μž…λ ₯λ°›κΈ°
    • 병사 번호, μ „νˆ¬λ ₯ λ°°μ—΄ μž…λ ₯λ°›κΈ°
  • 계산

    • d둜 ν…Œμ΄λΈ” μ΄ˆκΈ°ν™”ν•˜κΈ°
    • λ°”ν…€μ—…μœΌλ‘œ κ΅¬ν˜„
      • Math.max둜 μ΅œλŒ€ λ³‘μ‚¬μ˜ 수 κ΅¬ν˜„
      • 전체 - μ—΄μ™Έ 병사 수둜 좜λ ₯
  • 좜λ ₯

    • μ „μ²΄μ—μ„œ μ΅œλŒ€κ°’ μ œκ±°ν•΄μ„œ κ²°κ³Ό 좜λ ₯
import java.util.*;

public class Main {

    static int N;
    static int[] d;
    static int maxSol;
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);

        N = sc.nextInt();

        Integer[] arr = new Integer[N];
        for(int i=0; i<N; i++){
            arr[i] = sc.nextInt();
        }

        d = new int[N];
        Arrays.fill(d, 1);

        for(int i = 1; i<N; i++){
            for(int j = 0; j< i; j++) {
                if(arr[j] > arr[i]){
                    d[i] = Math.max(d[i], d[j]+1);
                }
            }
        }

        for(int i=0; i<N; i++){
            maxSol = Math.max(maxSol, d[i]);
        }
        System.out.println(N - maxSol);

    }
}

profile
μ–Έμ  κ°€ λ‚΄ μ½”λ“œλ‘œ 세상에 κΈ°μ—¬ν•  수 μžˆλ„λ‘, BE 개발 기둝 λ…ΈνŠΈβ˜˜οΈ

0개의 λŒ“κΈ€