본문 바로가기
공부 정리/백준

[백준] 자바 2776 암기왕

by 경적필패. 2021. 7. 13.
반응형

문제

연종이는 엄청난 기억력을 가지고 있다. 그래서 하루 동안 본 정수들을 모두 기억할 수 있다. 하지만 이를 믿을 수 없는 동규는 그의 기억력을 시험해 보기로 한다. 동규는 연종을 따라다니며, 연종이 하루 동안 본 정수들을 모두 ‘수첩 1’에 적어 놓았다. 그것을 바탕으로 그가 진짜 암기왕인지 알아보기 위해, 동규는 연종에게 M개의 질문을 던졌다. 질문의 내용은 “X라는 정수를 오늘 본 적이 있는가?”이다. 연종은 막힘없이 모두 대답을 했고, 동규는 연종이 봤다고 주장하는 수 들을 ‘수첩 2’에 적어 두었다. 집에 돌아온 동규는 답이 맞는지 확인하려 하지만, 연종을 따라다니느라 너무 힘들어서 여러분에게 도움을 요청했다. 동규를 도와주기 위해 ‘수첩 2’에 적혀있는 순서대로, 각각의 수에 대하여, ‘수첩 1’에 있으면 1을, 없으면 0을 출력하는 프로그램을 작성해보자.

입력

첫째 줄에 테스트케이스의 개수 T가 들어온다. 다음 줄에는 ‘수첩 1’에 적어 놓은 정수의 개수 N(1 ≤ N ≤ 1,000,000)이 입력으로 들어온다. 그다음 줄에  ‘수첩 1’에 적혀 있는 정수들이 N개 들어온다. 그다음 줄에는 ‘수첩 2’에 적어 놓은 정수의 개수 M(1 ≤ M ≤ 1,000,000) 이 주어지고, 다음 줄에 ‘수첩 2’에 적어 놓은 정수들이 입력으로 M개 들어온다. 모든 정수들의 범위는 int로 한다.

출력

‘수첩2’에 적혀있는 M개의 숫자 순서대로, ‘수첩 1’에 있으면 1을, 없으면 0을 출력한다.


테스트 케이스

 

초록색입력 / 검은색출력

 


접근

1.몇번 할지 테스트 케이스 입력을 받음

2. 몇 개의 수를 받을지 입력 받음

3.(2)에서 입력받은 만큼 수를 입력함

4. 몇 개의 수를 받을지 입력 받음 2

5.(4)에서 입력받은 만큼 수를 입력함

6.(5)에서 입력한 수가 (2)에서 입력했던 수인지 확인하여 입력되었던 수라면 1을 출력 아니라면 0을 출력함

 

저는 HASHSET을 이용하여서 값을 입력받은 다음에, CONTAINS함수를 사용하여 해쉬 셋에 있으면 1을 출력 없으면 0을 출력하는 식으로 구현하였더니 문제가 해결되었습니다.

 


코드

import java.awt.desktop.SystemEventListener;
import java.io.*;
import java.math.*;
import java.util.*;

public class Main {

	/*
 	2776 problem
	*/
	public static void main(String[] args) throws NumberFormatException, IOException {
		// TODO Auto-generated method stub
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		HashSet<Integer> hs = new HashSet<>();
		
		int testcase = Integer.parseInt(br.readLine());
		for(int i=0; i<testcase; i++) {
			hs.clear();
			int num = Integer.parseInt(br.readLine());
			StringTokenizer st = new StringTokenizer(br.readLine());
			for(int j=0; j<num; j++) {
				hs.add(Integer.parseInt(st.nextToken()));
			}
			
			num = Integer.parseInt(br.readLine());
			StringTokenizer st2 = new StringTokenizer(br.readLine());
			for(int j=0; j<num; j++) {
				if(hs.contains(Integer.parseInt(st2.nextToken()))) {
					bw.write(String.valueOf(1)+"\n");
				}
				else {
					bw.write(String.valueOf(0)+"\n");
				}
			}

			bw.flush();
		}
		bw.close();
	}
	
}

주의

testcase가 2 이상일 때 hashset 초기화해주는 것 주의

또한,

System.out.println()을 이용하여 출력하면 시간 초과가 뜹니다.

확실히 입출력 양이 많아지면 buffered 입출력이 빠른 듯합니다.

 

반응형

댓글