새벽코딩

[백준] [1764] 듣보잡 본문

알고리즘

[백준] [1764] 듣보잡

J 코딩 2022. 11. 16. 03:30
반응형

문제

김진영이 듣도 못한 사람의 명단과, 보도 못한 사람의 명단이 주어질 때, 듣도 보도 못한 사람의 명단을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다. 이름은 띄어쓰기 없이 알파벳 소문자로만 이루어지며, 그 길이는 20 이하이다. N, M은 500,000 이하의 자연수이다.

듣도 못한 사람의 명단에는 중복되는 이름이 없으며, 보도 못한 사람의 명단도 마찬가지이다.

출력

듣보잡의 수와 그 명단을 사전순으로 출력한다.

 

/* HashSet, Set 사용 */
import java.util.*;
import java.io.*;

public class Main {

	public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        HashSet<String> hashSet = new HashSet<>();
        Set<String> setStr = new TreeSet<String>();

        ArrayList<String> list = new ArrayList<>();

        String[] in = br.readLine().split(" ");
        int N = Integer.parseInt(in[0]);
        int M = Integer.parseInt(in[1]);

        for(int i = 0; i < N; i++) {
            hashSet.add(br.readLine());
        }

        for(int i = 0; i < M; i++) {
            String str = br.readLine();
            if(hashSet.contains(str)) {
                setStr.add(str);
            }
        }
        list.addAll(setStr);

        System.out.println(setStr.size());
        for(int r = 0; r < setStr.size(); r++) {
            System.out.println(list.get(r));
        }
	}
}

 

이 문제 해결을 위해 처음 생각한 방법은 입력 문자열을 해시셋에 담아두고 "보도 못한값" 들이 들어옴과 동시에 해시셋에 있으면 셋에 담았다. 셋에 담았을 때는 담는과 동시에 정렬이 이루어지므로 따로 정렬로직을 넣지않고, 이 값을 ArrayList에 담아 출력하였다.

이렇게 해서 문제를 해결했지만 시간이 맘에 들지 않았다..

 

 

 

 

import java.util.*;
import java.io.*;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        HashSet<String> hashSet = new HashSet<>();
        Set<String> setStr = new TreeSet<String>();
        
        ArrayList<String> list = new ArrayList<>();
        
        // 입력값
        String[] in = br.readLine().split(" ");
        int N = Integer.parseInt(in[0]);
        int M = Integer.parseInt(in[1]);
        
        for(int i = 0; i < N; i++) {
        	// 해시셋에 보관
        	hashSet.add(br.readLine());
        }
        
        for(int i = 0; i < M; i++) {
        	String str = br.readLine();
        	if(hashSet.contains(str)) {
        		list.add(str);
        	}
        }
        Collections.sort(list);
        
        System.out.println(list.size());
        for(int r = 0; r < list.size(); r++) {
        	System.out.println(list.get(r));
        }
        
	}

}

 

 

두번째로 적용한 방법은 ArrayList에 값을 담아서 Collections.sort(list)로 정렬을 해보았다.

Collections.sort()는 O(nlog(n)) 의 시간복잡도를 가진 정렬방법으로 시간에 우위를 가질 수 있다. 결과는

 

 

 

 

미세하지만 메모리와 시간이 절약되었다.

혹시 더 좋은 방법이 있다면 댓글로 알려주시면 감사하겠습니다.

 

-새벽 코딩-

반응형

'알고리즘' 카테고리의 다른 글

[백준] [1212] 8진수 2진수  (0) 2022.11.18
[백준] [10824] 네 수  (0) 2022.11.17
[백준] [4949] 균형잡힌 세상  (0) 2022.11.15
[백준] [1259] 팰린드롬수  (0) 2022.11.14
[백준] [1541] 잃어버린 괄호  (0) 2022.11.14
Comments