백준

[백준/BOJ] 1764번 : 듣보잡 (JAVA / 자바)

코메인 2022. 3. 10. 21:13

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

 

 

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

 

1764번: 듣보잡

첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다.

www.acmicpc.net


- 문제 -

 

난이도 실버 4 문제이다.

 

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

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

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

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

https://comain.tistory.com/3

 

(JAVA / 자바) Scanner 와 Bufferedreader

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

comain.tistory.com

 

풀이 방법

HashMap과 List로 풀었다.

HashMap에 듣도 못한 사람의 명단을 저장해준다. Key에 이름을 저장하고, value에는 1을 저장해준다.(어떤 값을 저장하든 상관없다.)

듣도 못한 사람의 명단을 다 저장했으면, 보도 못한 사람의 명단을 HashMap과 비교한다.

입력 값이 HashMap에 저장되어 있다면, 그 사람은 듣도보도 못한 듣보잡이기때문에 list에 저장하고, 개수를 저장할 변수 count에 +1을 해준다.

저장 여부는 HashMap.get(key) != null로 체크해준다. 해당 입력값이 저장되어있지 않다면 value에는 null값으로 나오기 때문이다.

듣보잡을 다 구했으면, 출력할때 사전순으로 출력하라 했으니, collections.sort로 정렬해주고 출력한다.

처음엔 듣보잡 개수. 두번째부터 듣보잡들의 이름을 사전 순으로 출력해야한다.

50만개의 값이 나올 수 있기 때문에 StringBuilder로 한번에 출력해준다.

 

코드를 보자.


-풀이-

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		StringBuilder sb = new StringBuilder();
		HashMap<String, Integer> hash = new HashMap<String, Integer>();
		List<String> list = new ArrayList<String>();
		
		for(int i = 0; i < N; i++) {
			hash.put(br.readLine(), 1);
		}
		
		int count = 0;
		
		for(int i = 0; i < M; i++) {
			String input = br.readLine();
			if(hash.get(input) != null) {
				list.add(input);
				count++;
			}
		}
		
		//정렬
		Collections.sort(list);
		
		sb.append(count).append("\n");
		for(int i = 0; i < list.size(); i++) {
			sb.append(list.get(i)).append("\n");
		}
		System.out.println(sb);
	}

}

-결과-

 


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