ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준/BOJ] 1384번 : 메시지 (JAVA / 자바)
    백준 2022. 2. 18. 14:54

    안녕하세요~ 코딩하는 코알못 코메인입니다.

     

     

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

     

    1384번: 메시지

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

    www.acmicpc.net


    - 문제 -

     

    난이도 브론즈 3 문제이다.

    자바에서 입력방식은 scanner와 bufferedreader가 있다.

    자바를 초반에 접하면 처음에 배우는 입력은 scanner이다. scanner가 bufferedreader보다 편하지만 속도가 느리다.

    bufferedreader는 무조건 문자열로 받아오기때문에 정수형이나 실수형 변수에 저장하기 위해서는 입력과 형변환을 해줘야한다.

    더 자세한 내용은 아래 글 참고 하면 좋다.

    https://comain.tistory.com/3

     

    (JAVA / 자바) Scanner 와 Bufferedreader

    안녕하세요~ 코딩하는 코알못 코메인입니다. 이번엔 백준 문제 풀면서 계속 언급될 scanner와 bufferedreader에 대한 간단한 정리를 해볼거다. 자바에서 입력은 scanner와 bufferedreader가 있다. 우선 각자

    comain.tistory.com

     

    풀이 방법

    사람이 5명 있으면 번호를 1번부터 5번까지 먹여본다,

    1번에서 5번까지 종이를 순서대로 넘겨준다. 그렇다면 1번이 평가를 먹여줄 사람은 5번 4번 3번 2번 순서로 총 5명이니 자기를 제외한 4명의 종이에 평가를 적어준다.

    1번 : 5번 4번 3번 2번

    2번 : 1번 5번 4번 3번

    3번 : 2번 1번 5번 4번

    4번 : 3번 2번 1번 5번

    5번 : 4번 3번 2번 1번

    완쪽이 평가하는 사람 : 오른쪽이 평가받는 사람 이다. 우선 이걸 이해해야 풀 수 있다.

     

    위 문제를 이해했다면 이제 구현을 할 차례이다. 자잘한 것을 다 빼고, 딱 저 부분에대한 구현을 보자.

    총 입력값은 5명 예를 들면 25개이다. 이 25개를 이차원 배열에 집어 넣을 것이다. 그렇다면 배열의 크기는 arr[5][5]가 될 것이다. 그리고 입력되는 값을 순서대로 arr[0][0~4], arr[1][0~4], ..., arr[4][0~4]까지 집어넣어준다.

    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();
    	}
    }

    배열에 입력값을 다 저장 했으면 입력된 순서대로 반복문과 조건문을 사용해 "N(나쁜말)"이 들어있는 값을 찾는다. 그리고 N값을 찾는다면 출력을 해줄 것인데, 나쁜말을 적은 사람과 적힌 사람의 이름을 구하는 방법은 인덱스를 통해 구할 것이다.

    위에 우선 이해하자 했던 내용을 보면 패턴을 알 수 있을 것이다. 먼저 사람들 이름이 저장된 배열은 arr[0~4][0]이다.

    그럼 각자 자신의 이름은 0~4라는 인덱스에 저장된 것이나 마찬가지다.

    5번이 다른 사람꺼를 적는 순서는 4번 3번 2번 1번이다. 자신의 번호에서 -1씩하면 상대방을 알 수 있다.

    P가 좋은말 N이 나쁜말인데 만약 5번 : P N P P라면 5번은 4번, 2번, 1번한테 좋은 말을 한 것이고, 3번한테 나쁜말을 한 것이다. N의 인덱스 값을 구하자. 5번이 0, P가 1, N이 2다. 그렇다면 5번의 인덱스 값을 구하자. 4이다. 그러면 4에 - 2를 해주면 상대방 인덱스 값이 나오는 것이다. 그렇다면 arr[4 - 2][0]이기 때문에 arr[2][0]인 3번이다.

    예제 하나를 더 보자. 2번 : P P N P이면 2번이 4번한테 나쁜말을 한다는거다. 2번의 인덱스 값은 1. N의 인덱스 값은 3이다. 그렇다면 이번에도 1 - 3을 하느냐? 아니다. 음수가 난와버리면 인덱스에 맞지않는 수가 되어버리기 때문에 두 연산이 음수가 나오면 다른 연산방식을 사용해야한다. 생가해보면 2번이 1번껄 썻으면 5번꺼를 쓴다. 그렇다면 인덱스 값의 변화가 2번인 1에서 시작이면 1번인 0인덱스로가고 5번인 4인덱스, 3번인 3인덱스까지 간다. 그렇다면 사람 수에서 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는 "N"이 하나도 없을 경우 다른 값을 출력하기 위한 변수이다.
    			count = 1;
    		}
    	}
    }

    이렇게 출력을 하게되면 문제에서 제시한 순서도 알아서 충족되어진다.

     

    전체 코드를 보자.


    -풀이-

     

    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 num = 1;
    		
    		//무한루프
    		while(true) {
    			
    			int n = Integer.parseInt(br.readLine());
    			
    			//0이 입력되면 무한루프 종료
    			if(n == 0) break;
    			
    			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);
    			
    			//count는 "N"이 하나도 없을 경우 다른 값을 출력하기 위한 변수이다.
    			int count = 0;
    			
    			for(int i = 0; i < n; i++) {
    				for(int j = 0; j < n; j++) {
    					if(arr[i][j].equals("N")) {
    						//작으면 뺏을때 음수이니 이렇게 해도 되고, j - i < 0으로 조건을 만들어도 된다.
    						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;
    					}
    				}
    			}
    			//그룹 번호
    			num++;
    			//"N"이 없으면 아래 문구를 출력
    			if(count == 0) {
    				System.out.println("Nobody was nasty");
    			}
    			System.out.println();
    		}
    	}
    
    }

    -결과-

     


    아직 코딩 공부가 부족한 필자라 설명과 풀이 방법이 많이 미흡할 수 있다. 코딩 고수분들은 보시고 문제점이 있다면 댓글로 말해주시면 감사한 마음으로 참고 수정 하겠습니다.

    이번엔 설명이 좀 길어지다 보니 중요 코드를 따로 올렸습니다. 만약 이렇게 올리는 것이 보기가 더 좋다면 댓글로 말해주면 고려해서 다른 문제에도 적용해보겠습니다.

    댓글