문제 풀이/백준

[백준] 1083번. 소트(JAVA)

27200 2025. 3. 23. 11:37

문제

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


풀이(25분)

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

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());

        ArrayList<Integer> arr = new ArrayList<>();
        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            arr.add(Integer.parseInt(st.nextToken()));
        }

        int S = Integer.parseInt(br.readLine());

        int moveCnt = 0;
        int changeIdx = 0;
        while (moveCnt < S && changeIdx < N - 1) {
            int maxNum = arr.get(changeIdx);
            int maxIdx = -1;

            int idx = changeIdx + 1;
            int count = 1;
            while (moveCnt + count <= S && idx < N) {
                int num = arr.get(idx);
                if (num > maxNum) {
                    maxNum = num;
                    maxIdx = idx;
                }
                count++;
                idx++;
            }

            if (maxIdx != -1) {
                arr.remove(maxIdx);
                arr.add(changeIdx, maxNum);
                moveCnt += maxIdx - changeIdx;
            }
            changeIdx++;
        }

        StringBuilder sb = new StringBuilder();
        for (int i : arr) {
            sb.append(i).append(' ');
        }
        System.out.println(sb);
    }
}

문제 풀이 전략

 

생각해 보면 되게 간단한 문제이다.

 

문제에서 제시된 예제를 보자.

10
19 20 17 18 15 16 13 14 11 12
5

10개의 수 19, 20,... 을 5번 바꾼 것 중 사전순으로 제일 뒤에 있는 것을 찾으라는 뜻이다.

 

사전순으로 제일 뒤에 가게 되려면 큰 것이 제일 앞에 오는 게 우선이다. 그 뒤에 값이 어떻든 무조건 큰 수가 오는 게 우선이다.

그 말은 하나를 바꾼 뒤가 어쩌고 저쩌고 상관 없이, 일단 제일 앞에서부터 가능한 큰 수를 놓자!라는 것이다.

19를 바꿀 수 있는 후보로는 20(1), 17(2), 18(3), 15(4), 16(5) 이다. 그럼 당연히 20과 바꿔야 한다!

 

즉, 한번 바꾼 후에는 20, 19, 17, ... 이 된다.

이제 s = 4로 줄었을 것이고, 19의 후보군에는 여전히 16(4)이 위치하게 된다. 여기서 16(5) -> 16(4)가 되었음을 생각하자.

바꿀 이유가 없으니 패스한다. 이런 식으로 앞에서부터 큰 수를 맞춰가면 된다!

 

또한 N은 50까지인 반면 S의 최댓값은 매우 크기 때문에 S가 N의 길이보다 크거나 같다면 최댓값을 가져와서 변경해 주면 된다!

'문제 풀이 > 백준' 카테고리의 다른 글

[백준] 1253번. 좋다(JAVA)  (0) 2025.03.24
[백준] 1106번. 호텔(JAVA)  (0) 2025.03.23
[백준] 1593번. 문자 해독(JAVA)  (0) 2025.03.22
[백준] 1599번. 민식어(JAVA)  (0) 2025.03.22
[백준] 2671번. 잠수함식별(JAVA)  (0) 2025.03.21