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 |