일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 아스키코드
- dfs
- Queue
- 완전탐색
- 다이나믹프로그래밍
- 구현
- Python
- 그리디
- LIS
- BFS
- 백준
- 빅데이터
- 브루트포스
- 다리 만들기
- 탐색
- 백트래킹
- DP
- 새벽코딩
- SQL
- 배열
- Stack
- oracle
- BufferedReader
- HashMap
- 시뮬레이션
- 알고리즘
- Java
- 스택
- 프로그래머스
- 문자열
Archives
- Today
- Total
새벽코딩
[백준] [1764] 듣보잡 본문
반응형
문제
김진영이 듣도 못한 사람의 명단과, 보도 못한 사람의 명단이 주어질 때, 듣도 보도 못한 사람의 명단을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 듣도 못한 사람의 수 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