나를 기록하다
article thumbnail
반응형

백준 1384 자바(java)

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

 

1384번: 메시지

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

www.acmicpc.net

문제

Misfits 아카데미는 문제아들을 위한 치유 시간을 도입했습니다. 그 중 한 가지 활동은 아이들이 타인에 대해 예의를 갖출 수 있도록 고안되었으며, 내용은 아래와 같습니다.

아이들은 원형으로 앉은 뒤 종이 위에 자신의 이름을 적습니다. 다음 각자의 종이를 자기 왼편으로 전달합니다. 종이를 전달받았으면, 종이 맨 위에 쓰인 이름을 가진 아이에 대해 좋은 메시지를 써줍니다. "너는 멋져.", "도와줘서 고마워"같은 말들을요. 메시지는 종이 아래쪽에 적으며, 적은 뒤에는 종이를 접어 가립니다. 다음으로 종이를 왼편으로 넘기고 같은 활동을 반복합니다. 자신의 이름이 맨 위에 적힌 종이를 받으면 활동을 종료하고 각자 다른 아이들이 자기에게 남긴 메시지들을 읽어봅니다.

하지만 가끔 "넌 너무 말이 많아.", "니 옷 후져."처럼 제멋대로 글을 쓰는 아이들이 있습니다. 이런 글을 읽게 되면 기분이 좋지 않겠죠? 이런 말을 한 아이를 알려주세요!

입력

입력은 번호를 가진 그룹들로 이루어져 있습니다. 그룹의 번호는 1부터 시작하며 1씩 증가합니다. 각 그룹의 입력은 참여한 아이들의 수 n(5 ≤ n ≤ 20)이 한 줄에 주어지면서 시작됩니다. 다음 n 줄에 걸쳐 위 활동을 끝마친 종이 n장이 입력됩니다. n 줄의 순서는 아이들이 앉아있고 종이를 넘기던 순서와 같습니다. 예를 들어 첫 번째 줄에 해당하는 아이는 두 번째 줄에 해당하는 아이에게 종이를 넘겼고, 마지막 줄에 해당하는 아이는 첫 번째 줄에 해당하는 아이에게 종이를 넘겼습니다.

각 줄은 종이 맨 위의 이름으로 시작합니다. 다음으로 공백을 사이에 두고 종이에 적힌 메시지가 종이 위에서부터 아래로 순서대로 쓰입니다. 문제를 간단하게 하기 위해 좋은 메시지는 'P'로, 나쁜 메시지는 'N'으로 표기합니다. 이름은 60글자 이하의 알파벳 소문자 또는 대문자로 이루어져 있습니다.

마지막 줄에 '0'이 입력되면서 입력이 종료됩니다. '0'은 처리하지 않습니다.

출력

그룹 번호를 "Group 1"과 같이 출력함으로써 출력을 시작합니다. 그 다음 줄부터 누가(A) 누구(B)에게 나쁜 말을 했는지 "A was nasty about B"로 한 줄씩 출력합니다. 나쁜 말이 여러 개라면, 입력받은 순서대로─첫 번째 종이부터, 왼쪽에서 오른쪽으로─출력합니다. 아무도 나쁜 말을 하지 않았다면 "Nobody was nasty"를 출력합니다.

각 그룹을 빈 줄로 구분합니다.

 

문제풀이

문제를 잘못 이해하고 잘못된 방식으로 접근하여 고생을 많이했다. 그룹별로 배열을 만들고, 2차원 boolean 배열을 만들어서 i == j 인 경우에는 모두 false로 만들고, N이 등장할 때만 true로 만들어서 출력을 하게끔 구현을 했는데 계속 틀리고, 다시 생각해보니 P P P P, P N P P의 문자들의 인덱스가 상대 위치이기에 내가 생각한 풀이법이 잘못된 것이었다. 알고리즘을 풀 때는 문제를 확실히 이해하고 푸는게 중요하다고 매번 들었는데 아직 많이 부족한 것 같다. 앞으로 풀 때는 확실하게 풀이 방법을 정리하고 슈도 코드를 작성한 후 풀이를 진행하려 노력하겠다. 틀린 풀이와 맞는 풀이 모두 첨부하겠다.

 

 

첫번째 풀이(오답)

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int groupNum = 1; // 그룹 번호 초기화
        
        // 무한 루프로 여러 그룹에 대한 처리 수행
        while (true) {
            int n = Integer.parseInt(br.readLine()); // 입력 행 수
            
            // 입력된 행 수가 0이면 프로그램 종료
            if (n == 0) break;

            String[] children = new String[n]; // 아이들 이름을 저장하는 배열
            boolean[][] message = new boolean[n][n]; // "P" 또는 "N" 여부를 저장하는 배열
            int count = 0; // "N" 관계의 수를 저장하는 변수

            System.out.println("Group " + groupNum); // 현재 그룹 번호 출력
            
            // 각 아이들의 이름과 관계 정보를 입력받아 배열에 저장
            for (int i = 0 ; i < n ; i++) {
                StringTokenizer st = new StringTokenizer(br.readLine());
                children[i] = st.nextToken(); // 아이의 이름 저장
                for (int j = 0 ; j < n ; j++) {
                    if (i == j) {
                        message[i][j] = false; // 대각선 상의 관계는 항상 false
                    } else {
                        String word = st.nextToken(); // "P" 또는 "N" 입력
                        if (word.equals("N")) {
                            message[i][j] = true; // "N"인 경우 해당 관계가 true로 표시
                        } else {
                            message[i][j] = false;
                        }
                    }
                }
            }
            
            // 각 아이들 간의 관계를 검사하여 "N"인 관계를 출력
            for (int i = 0 ; i < n ; i++) {
                for (int j = 0 ; j < n ; j++) {
                    if (message[i][j] == true) {
                        int idx = j;
                        if (i < idx) idx = n + i - idx; // 사이클 처리를 위한 인덱스 조정
                        
                        // "N" 관계가 있을 경우 해당 문구 출력 및 카운트 증가
                        System.out.println(children[idx] + " was nasty about " + children[i]);
                        count++;
                    }
                }
            }
            
            // "N" 관계가 없을 경우 해당 문구 출력
            if (count == 0) {
                System.out.println("Nobody was nasty");
            }
            
            System.out.println(); // 그룹 사이 공백 줄 출력
            groupNum++; // 다음 그룹 번호 증가
        }
        br.close(); // 입력 스트림 닫기
    }
}

 

 

두번째 풀이(정답)

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

public class Main {
    
    public static void main(String[] args) throws IOException {
        // 입력을 받기 위한 BufferedReader 생성
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int num = 1; // 그룹 번호를 초기화
        
        // 무한루프를 통해 여러 그룹에 대한 처리 수행
        while(true) {
            int n = Integer.parseInt(br.readLine()); // 사람 수를 입력받음
            
            // 0이 입력되면 무한루프를 종료하여 프로그램을 종료
            if(n == 0) break;
            
            // 사람들의 정보를 저장할 2차원 배열 선언
            String[][] arr = new String[n][n];
            
            // 사람들의 정보를 입력받아 배열에 저장
            for(int i = 0; i < n; i++) {
                StringTokenizer st = new StringTokenizer(br.readLine());
                for(int j = 0; j < n; j++) {
                    arr[i][j] = st.nextToken();
                }
            }
            
            // 현재 그룹 번호 출력
            System.out.println("Group " + num);
            
            int count = 0; // "N"이 없을 경우를 판단하기 위한 변수
            
            // 사람들의 관계를 확인하여 "N"에 해당하는 관계를 출력
            for(int i = 0; i < n; i++) {
                for(int j = 0; j < n; j++) {
                    if(arr[i][j].equals("N")) {
                        if(i < j) {
                            System.out.println(arr[n - (j - i)][0] + " was nasty about " + arr[i][0]);
                        } else {
                            System.out.println(arr[i - j][0] + " was nasty about " + arr[i][0]);
                        }
                        count = 1; // "N"이 발견되었음을 표시
                    }
                }
            }
            
            num++; // 그룹 번호 증가
            
            // "N"이 없을 경우 해당 문구 출력
            if(count == 0) {
                System.out.println("Nobody was nasty");
            }
            
            System.out.println(); // 그룹 사이에 공백 줄 출력
        }
    }
}
반응형
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...