알고리즘(백준 등) 공부

백준 1384번: 메시지

posite 2026. 4. 16. 11:48

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

 

1384번: 메시지

그룹 번호를 "Group 1"과 같이 출력함으로써 출력을 시작합니다. 그 다음 줄부터 누가(A) 누구(B)에게 나쁜 말을 했는지 "A was nasty about B"로 한 줄씩 출력합니다. 나쁜 말이 여러 개라면, 입력받은 순

www.acmicpc.net

 

각 그룹에서 본인의 이름을 맨 위에 적은 후, 롤링페이퍼를 돌려서 메시지들에 대해서 누가 누구에게 나쁜 말을 했는지 순서대로 출력하는 문제이다. 여러개라면 첫번째 종이부터, 왼쪽부터 오른쪽 순서로 출력한다. 왼쪽은 입력 순서로 먼저 온 사람이며, 맨 앞으로 온 쪽지는 맨뒤로 돌리게 된다. 입력은 그룹의 사람 수가 입력된 후, 순서대로 사람 수 만큼 메시지를 받는 사람의 이름, 받은 메시지가 좋은 메시지 인지(P), 나쁜 메시지 인지(N) 구분하기 위한 입력이 나열된 줄이 들어온다.

 

메시지를 커스텀 클래스를 작성하여 누가 누구에게 나쁜 메시지를 몇번째로 작성했는지를 저장한다.

static class Message {
    
    int from, to, order;
    
    public Message(int from, int to, int order) {
        this.from = from;
        this.to = to;
        this.order = order;
    }
}
Map<Integer, String> map = new HashMap<>();
List<Message> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
    StringTokenizer st = new StringTokenizer(br.readLine());
    map.put(i, st.nextToken());
    for (int j = 1; j <= n - 1; j++) {
        String message = st.nextToken();
        if (message.charAt(0) == 'N') {
            list.add(new Message(i - j >= 0 ? i - j : i - j + n, i, j));
        }
    }
}

 

 

그후, 순서대로 누가 누구에게 나쁜 메시지를 작성했는지 출력 형식에 맞추어 출력한다.

if (list.isEmpty()) {
    sb.append("Nobody was nasty").append('\n');
} else {
    for (Message message : list) {
        sb.append(map.get(message.from)).append(" was nasty about ").append(map.get(message.to))
                .append('\n');
    }
}

 

 

결과 코드는 다음과 같다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

public class 메시지1384 {
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int group = 1;
        while (true) {
            int n = Integer.parseInt(br.readLine());
            if (n == 0) {
                br.close();
                break;
            }
            sb.append("Group ").append(group).append('\n');
            Map<Integer, String> map = new HashMap<>();
            List<Message> list = new ArrayList<>();
            for (int i = 0; i < n; i++) {
                StringTokenizer st = new StringTokenizer(br.readLine());
                map.put(i, st.nextToken());
                for (int j = 1; j <= n - 1; j++) {
                    String message = st.nextToken();
                    if (message.charAt(0) == 'N') {
                        list.add(new Message(i - j >= 0 ? i - j : i - j + n, i, j));
                    }
                }
            }
            if (list.isEmpty()) {
                sb.append("Nobody was nasty").append('\n');
            } else {
                for (Message message : list) {
                    sb.append(map.get(message.from)).append(" was nasty about ").append(map.get(message.to))
                            .append('\n');
                }
            }
            
            sb.append('\n');
            group++;
        }
        System.out.print(sb);
    }
    
    static class Message {
        
        int from, to, order;
        
        public Message(int from, int to, int order) {
            this.from = from;
            this.to = to;
            this.order = order;
        }
    }
}