https://www.acmicpc.net/problem/20291
코드설명
문자열문제에서 HashMap 문제입니다.
문제로직입니다.
1. 입력된 문자열을 점(.)으로 분리하고, 이를 해시맵에 저장하여 확장자별로 개수를 카운트합니다.
2. 해시맵의 엔트리들을 Node 객체로 만들어 리스트에 저장하고, 확장자를 기준으로 정렬합니다.
3. 정렬된 결과를 출력합니다.
문제에서 주의해야할점은
1.split 할시 '\\.' 으로 해야만 인식합니다. 이는 우물정자나 점 등등에도 적용됩니다.( 자바에서 Split 메소드의 파라미터는 정규표현식으로 인식합니다. 정규 표현식에서 "."은 모든 문자와 일치하는 특수 문자입니다. )
strSplit = str.split("\\.");
혹은 정규표현식으로 인식시키기 위해 아래와 같이 정규표현식 문자 클래스 [ ] 를 사용해주어, 정규표현식을 사용할것이라고 명시합니다.
String[] splited = str.split("[.]");
2. entrySet을 사용하여 순회할경우
for(Map.Entry<String, Integer> entry : hashmap.entrySet()) {
nodeArr.add(new Node(entry.getKey(), entry.getValue()));
}
3. 2번 과정은 조금 복잡할 수 있습니다. 아래와 같이 keySet을 순회하고 hashmap.get(key)로 value를 찾을 수도 있습니다.
for(String key : hashmap.keySet()){
System.out.println("key:"+key+"value:"+hashmap.get(key));
}
코드
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.Map;
import java.util.StringTokenizer;
public class Main {
public static int N;
public static HashMap<String, Integer> hashmap = new HashMap<>();
public static int answer = 0;
public static StringBuilder sb = new StringBuilder();
public static String str;
public static String[] strSplit = new String[2];
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
for(int i=0;i<N;i++) {
st = new StringTokenizer(br.readLine());
str = st.nextToken();
strSplit = new String[2];
strSplit = str.split("\\.");
hashmap.put(strSplit[1], hashmap.getOrDefault(strSplit[1], 0) + 1);
}
ArrayList<Node> nodeArr = new ArrayList<>();
for(Map.Entry<String, Integer> entry : hashmap.entrySet()) {
nodeArr.add(new Node(entry.getKey(), entry.getValue()));
}
Collections.sort(nodeArr);
for(Node temp : nodeArr) {
System.out.println(temp.a+" "+temp.cnt);
}
}
}
class Node implements Comparable<Node>{
String a;
int cnt;
public Node(String a, int cnt) {
this.a=a;
this.cnt=cnt;
}
@Override
public int compareTo(Node other) {
if(a.compareTo(other.a) > 0) {
return 1;
}else if(a.compareTo(other.a) < 0 ){
return -1;
}else {
return 0;
}
}
}
TreeMap을 활용할경우 자동으로 정렬이 되어 코드가 더 짧아집니다.
package Main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.TreeMap;
public class Main {
private static int N, M, Q, K;
private static double[] arr;
private static int answer = 0;
private static TreeMap<String, Integer> hashmap = new TreeMap<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
for(int i=0;i<N;i++) {
st = new StringTokenizer(br.readLine());
String str = st.nextToken();
String[] splited = str.split("[.]"); // '.' 을 사용하기 위해서는 이스케이프문을 사용해야한다. "\\."
//혹은 정규표현식 문자 클래스 [.] 를 사용한다.
hashmap.put(splited[1], hashmap.getOrDefault(splited[1], 0) + 1);
}
for(Map.Entry<String, Integer> entrySet : hashmap.entrySet()) {
System.out.println(entrySet.getKey()+" "+entrySet.getValue());
}
}
}
'알고리즘 > 해시를 사용한 집합과 맵' 카테고리의 다른 글
[백준] 14425 문자열 집합 - HashSet(해시셋) JAVA (0) | 2024.03.26 |
---|---|
[백준] 11652 카드 - HashMap(해시맵) JAVA (0) | 2024.03.26 |
[백준] 1269 대칭 차집합 - HashSet(해시셋) JAVA (0) | 2024.03.25 |
[백준] 7785 회사에 있는 사람 - HashSet(해시셋) JAVA (0) | 2024.03.25 |
[백준] 18870 좌표 압축 - 정렬(Sort) + 해시맵(HashMap) JAVA (0) | 2023.07.19 |