[백준] 1384번 : 메시지 (JAVA)

2026. 3. 10. 19:52·코테(Solved.ac + Programmers)
728x90

🔗 문제 링크

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


📌 문제 개요

사람들이 원형으로 앉아 서로에 대한 평가를 남긴다.
각 사람의 줄에는 자신에 대한 다른 사람들의 평가가 P 또는 N으로 주어진다.

  • P : 긍정적인 말
  • N : 나쁜 말

N이 등장하면 누가 그 말을 했는지 찾아 다음 형식으로 출력해야 한다.

 

A was nasty about B

 

만약 N이 하나도 없다면 Nobody was nasty 를 출력한다.

 

또한 테스트 케이스마다 Group 번호를 출력해야 한다.


📌 접근 방법

이 문제는 구현 + 시뮬레이션 문제이다.

각 줄은 현재 사람(i)에 대한 평가이며 평가는 앞에 앉은 사람들 순서로 주어진다.

 

따라서 N이 발견되면 누가 말했는지를 역방향으로 계산해야 한다.


📌 핵심 아이디어

사람들은 원형으로 앉아 있기 때문에 인덱스가 순환

Ann P N P P

 

N의 위치가 j라면 발언자는 다음 공식으로 구한다.

speaker = (i - j - 1 + n) % n
  • i → 피해자
  • j → 평가 위치
  • n → 전체 사람 수

이렇게 하면 원형 구조에서도 올바른 발언자를 찾을 수 있다.


📌 전체 코드

package no_1384;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class No1384 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int group = 1;

        while (true) {

            int n = Integer.parseInt(br.readLine());
            if (n == 0) break;

            String[] name = new String[n];
            char[][] arr = new char[n][n - 1];

            for(int i = 0; i < n; i++){
                StringTokenizer st = new StringTokenizer(br.readLine());

                name[i] = st.nextToken();

                for(int j = 0; j < n - 1; j++){
                    arr[i][j] = st.nextToken().charAt(0);
                }
            }

            System.out.println("Group " + group);

            boolean flag = false;

            for(int i = 0; i < n; i++){
                for(int j = 0; j < n - 1; j++){

                    if(arr[i][j] == 'N'){
                        int speaker = (i - j - 1 + n) % n;

                        System.out.println(name[speaker] + " was nasty about " + name[i]);
                        flag = true;
                    }
                }
            }

            if(!flag){
                System.out.println("Nobody was nasty");
            }

            System.out.println();
            group++;
        }
    }
}

📌 정리

이 문제의 핵심은 원형 인덱스 처리이다.

 

speaker = (i - j - 1 + n) % n

 

이 공식만 이해하면 쉽게 해결할 수 있는 구현 문제이다.

시간복잡도는 O(n²) 이며 n ≤ 20이므로 충분히 빠르게 동작한다.

728x90

'코테(Solved.ac + Programmers)' 카테고리의 다른 글

[백준] 2309번 : 일곱 난쟁이 (JAVA)  (0) 2026.03.12
[백준] 1417번 : 국회의원 선거 (JAVA)  (0) 2026.03.11
[백준] 2167번 : 2차원 배열의 합 (JAVA)  (0) 2026.03.09
[백준] 1292번 : 쉽게 푸는 문제 (JAVA)  (0) 2026.03.08
[백준] 1402번 : 아무래도이문제는A번난이도인것같다 (JAVA)  (0) 2026.03.07
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
  • [백준] 2309번 : 일곱 난쟁이 (JAVA)
  • [백준] 1417번 : 국회의원 선거 (JAVA)
  • [백준] 2167번 : 2차원 배열의 합 (JAVA)
  • [백준] 1292번 : 쉽게 푸는 문제 (JAVA)
PUSH → MERGE → DEPLOY
PUSH → MERGE → DEPLOY
데이터 흐름과 운영 자동화를 설계하는 백엔드 개발자
  • PUSH → MERGE → DEPLOY
    Coding Dongin
    PUSH → MERGE → DEPLOY
  • 전체
    오늘
    어제
    • MEUN
      • 코테(Solved.ac + Programmers)
      • BootCamp(JAVA)
      • JAVA
      • SpringBoot
      • JavaScript
      • JSP
      • DB(SQL)
      • React
      • HTML_CSS
      • jQuery
      • SCSS
      • GSAP
      • 설치 + 꿀팁
      • 정보처리기사 오답노트
      • 정보처리기사 기출문제
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GIT
  • 공지사항

  • 인기 글

  • 태그

    solved.ac
    배열
    백준
    브루트포스
    수학
    알고리즘
    프로그래머스
    기출문제
    dp
    정처기실기
    정보처리기사
    level0
    정처기오답노트
    정렬
    문자열
    백엔드개발자
    시뮬레이션
    실기
    정처기
    자료구조
    level1
    Level2
    자바
    springboot
    구현
    정보처리기사 실기 기출문제
    코딩테스트
    완전탐색
    java
    피보나치
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.4
PUSH → MERGE → DEPLOY
[백준] 1384번 : 메시지 (JAVA)
상단으로

티스토리툴바