PS/Greedy

백준 24025번: 돌의 정령 줄세우기 (Java)

닻과매 2022. 8. 16. 13:32

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

 

24025번: 돌의 정령 줄세우기

$4$, $1$, $5$, $2$, $3$으로 배치한다면 돌의 정령 무리들의 시야점수는 각각 $2$, $1$, $10^9$, $1$, $10^9$로 조건을 만족한다.

www.acmicpc.net

 

 

 

 

 

 

 

 


 

풀이

전형적인 코드포스 스타일의 구성적/그리디 문제입니다. 쌩 브루트포스는 O(N!)일테니 절대 안되며, 적당히 가지치기한다고 해도 O(N^2) 이하로 줄이기가 쉽지 않아보입니다. 그러다 보면, '최적의 배치가 존재하지 않을까?'와 같은 생각에 도달하게 됩니다(그리디 말고는 생각나는게 없으니...). 그리디하게 찾아보도록 합니다.

 

1-based를 기준으로, 1 <= i <= N-1번째 칸에 대하여, i = 1부터 N-1까지 반복문을 수행하면서

A_i > 0: 현재 남은 돌의 정령 중 가장 키가 큰 정령을 배치합니다.

A_i < 0: 현재 남은 돌의 정령 중 가장 키가 작은 정령을 배치합니다.

마지막으로 N번째 자리에는 남은 돌의 정령 1마리를 배치합니다.

 

이런 식으로 배치하면, 1 <= i <= N-1에 대하여

A_i > 0인 경우: i번째 돌의 정령의 오른쪽에 i번째 돌의 정령보다 키가 큰 돌의 정령이 없기에, 시야 점수는 10^9이 됩니다. 10^9 > N이므로 언제나 조건을 만족합니다.

A_i < 0인 경우: 바로 오른쪽에 키가 큰 돌의 정령이 붙기에, 시야 점수는 1이 됩니다. |A_i| >= 1이므로, 언제나 조건을 만족합니다.

그리고, N번째 돌의 정령의 시야 점수는 무조건 10^9이기에, A_N이 음수라면 조건을 만족하는 배치가 불가능하며, A_N이 양수라면 조건을 만족하는 배치가 가능합니다.

 

 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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());
        StringBuilder sb = new StringBuilder();
        StringTokenizer st = new StringTokenizer(br.readLine());
        int l = 1, r = N;
        for (int i = 0; i < N-1; i++) {
            if (Integer.parseInt(st.nextToken()) > 0) {
                sb.append(r+" ");
                r--;
            } else {
                sb.append(l+" ");
                l++;
            }
        }
        
        if (Integer.parseInt(st.nextToken()) < 0) {
            System.out.println(-1);
        } else {
            sb.append(r+"");
            System.out.println(sb.toString());
        }
    }
}
 
cs

 

 

P.S.

집에 있는 돌의 정령 인형

'PS > Greedy' 카테고리의 다른 글

백준 2437번: 저울 (Java)  (0) 2022.07.23
백준 17451번: 평행 우주 (Java)  (0) 2022.07.20
백준 1461번: 도서관 (Java)  (0) 2022.07.19
백준 3663번: 고득점 (Java)  (0) 2022.06.30
프로그래머스: 110 옮기기 (Java)  (0) 2022.06.20