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

 

20291번: 파일 정리

친구로부터 노트북을 중고로 산 스브러스는 노트북을 켜자마자 경악할 수밖에 없었다. 바탕화면에 온갖 파일들이 정리도 안 된 채 가득했기 때문이다. 그리고 화면의 구석에서 친구의 메시지를

www.acmicpc.net

코드설명

문자열문제에서 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());
        }
        
        
    }
    
}

+ Recent posts