[백준] 1380번: 귀걸이

응갱·2022년 9월 26일
0

백준

목록 보기
21/56
post-thumbnail

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

📎문제

파스칼 고등학교에 다니는 많은 여학생들은 규정에 없는 귀걸이를 착용한 채 도망다닙니다. Sneddon 교감선생님은 흔들거리는 긴 빨간 귀걸이들을 볼때마다 압수합니다.

교감선생님은 귀걸이를 압수당한 여학생들을 숫자를 매겨 리스트를 작성하고 있습니다. 그리고 압수한 귀걸이 뒤쪽에 여학생 번호와 마음대로 선택한 'A' 또는 'B'를 함께 적어두었습니다.

모든 정규 일과와 방과후 수업의 감금이 끝나면, 여학생들은 교감선생님을 찾아와 귀걸이를 돌려받습니다. 불행하게도 어느 날, 교감선생님은 귀걸이가 든 봉투를 잃어버렸고, 하나를 끝내 찾지 못했습니다.

귀걸이를 받지 못해 화난 소녀의 이름을 교감선생님께 알려주세요.

📎입력

입력은 번호를 가진 시나리오들로 구성됩니다. 시나리오 번호는 1부터 순서대로 증가하고, 각 시나리오는 아래의 내용을 포함합니다.

  • 한 줄에 귀걸이를 압수당한 여학생의 수, n (1 ≤ n ≤ 100)이 주어집니다.
  • 다음 n줄에 걸쳐 여학생들의 이름(최대 60자)이 주어집니다.
  • 다음 2n − 1줄에 여학생 번호와 'A' 또는 'B'가 공백을 사이에 두고 주어집니다. 번호는 교감선생님의 여학생 이름 리스트와 순서가 일치합니다. 즉, 1은 첫 번째로 압수당한 여학생입니다. 여학생 번호는 최대 2번 등장하며, 두 번째로 등장할 때는 첫 번째 경우와 다른 'A' 또는 'B'가 뒤에 적힙니다.
    번호가 처음 등장하는 것은 압수되었음을, 두 번째로 등장하는 것은 돌려받았음을 의미합니다.

'0'을 마지막 줄로 하여 입력이 종료됩니다. '0'은 처리하지 않습니다.

📎출력

시나리오 번호와 귀걸이를 돌려받지 못한 여학생의 이름을 공백으로 구분하여 한 줄씩 출력하십시오.

📎코드

import java.util.ArrayList;
import java.util.Scanner;

public class pr1380 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int scene_num=1;	//시나리오 번호
        
		while(true) {
			String AB=" ";	//A or B를 입력할 String
			String n = sc.nextLine();	//귀걸이를 압수당한 여학생의 수
			int n1=Integer.parseInt(n);
			if(n1==0) break;
			
			String[] name=new String[n1];	//여학생들의 이름을 저장할 String 배열
			for(int i=0; i<n1;i++) {
				name[i]=sc.nextLine();
			}
            
			ArrayList<String> k = new ArrayList<String>();	// 여학생 번호를 입력받을 ArrayList.
			
			for(int i=0;i<2*n1-1;i++) {
				String num=sc.next();
				if(k.contains(num))	// 해당 번호가 두 번째로 등장하면 돌려받는 것이기 때문에 해당 번호가 ArrayList에 포함되어 있으면 제거.
					k.remove(num);
				else
					k.add(num);
				
				AB = sc.nextLine();	//A or B를 입력받음. A와 B는 결과에 영향을 주지 않기 때문에 받기만 함.
			}
			Integer tmp=Integer.parseInt(k.get(0))-1;	//ArrayList에 남아있는 번호는 귀걸이를 돌려받지 못한 여학생의 리스트 번호이다.
			System.out.println(scene_num+" "+name[tmp]);
			scene_num++;
			
		}
		sc.close();

	}

}

📎코드해석

  • 여학생들의 이름을 String 배열에 저장한다.
  • 입력에서 A와 B는 결과에 영향을 주지 않기 때문에 입력만 받고 사용하지 않는다.
  • 번호가 ArrayList에 존재하지 않는다면 압수되었음을, 존재한다면 돌려받았음을 의미한다.
  • ArrayList에 마지막까지 존재하는 번호가 귀걸이를 돌려받지 못한 여학생의 리스트번호이다.
  • 위의 번호는 여학생들의 이름을 저장한 String배열 index-1이다.

전부 String으로 입력받은 이유는 계속 InputMismatchException이 나와서이다. (Scanner로 입력받아서 생기는 오류 같은데 ,, 도무지 왜 생기는지 모르겠다. 이게 해결된걸까?)
번호를 입력받는 for문에서 StringTokenizer를 사용하면 해결이 되는 것 같다.
참고> https://umilove98.tistory.com/58

🥔후기

왜 사람들이 대부분 StringTokenizer을 사용하는지 알겠다... Scanner를 잘 사용하지 않는 이유도 , , ,


+++📎다시 푼 코드

import java.util.ArrayList;
import java.util.Scanner;

public class pr1380 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int scene_num=1;
		while(true) {
			String AB=" ";
			int n = sc.nextInt();
			if(n==0) break;
			
			sc.nextLine();
			String[] name=new String[n];
			for(int i=0; i<n;i++) {
				name[i]=sc.nextLine();
			}
			ArrayList<String> k = new ArrayList<String>();
			for(int i=0;i<2*n-1;i++) {
				String num=sc.next();
				if(k.contains(num))
					k.remove(num);
				else
					k.add(num);
				AB = sc.nextLine();
			}
			int tmp = Integer.parseInt(k.get(0));
			System.out.println(scene_num+" "+name[tmp-1]);
			scene_num++;
		}
	}

}

nextLine 사용 시 이전에 next--- 메소드를 사용했다면 이전의 키 값이 버퍼에 남아있어 에러가 발생한다. 그래서 nextLine 을 사용한다면 버퍼에 남아있는 키 값을 지워주기 위해 nextLine직전에 한 번 더 nextLine을 사용해주어야 한다.

  • 앞서 풀때 계속 에러가 발생했던 이유는 n을 입력받을 때 nextInt를 사용하고 버퍼의 키값을 지워주지 않아서다.
profile
🥔 한 덩이

0개의 댓글