백준 1302번: 베스트셀러



문제 설명

  • https://www.acmicpc.net/problem/1302
  • 입력으로 주어지는 문자열 중 빈도수가 가장 높은 문자열을 출력하는 문제입니다.
    • 빈도수가 동일하면 사전순으로 앞서는 문자열을 출력해야 합니다.

접근법

  • Map은 값이 등장한 횟수를 표현하기 좋은 자료구조 입니다.

pseudocode

for(){
	if(처음 등장하는 제목이면){
    	map.put(제목,1) // 해당 책이 1번 등장했음
    }else{ // 등장한 제목이면
    	map.put(제목,map.get(제목)+1)
    }
    
    if(최댓값이 갱신되면){
    	비교값 갱신
    }
    if(최댓값과 동률이면){
    	문자열 순서비교
    }
    
}

정답

import java.util.*;

public class Main {
	public static void main(String[] args) {
		HashMap<String,Integer> map = new HashMap<String,Integer>();
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int MaxInt = 0;
		String MaxString = "";
		sc.nextLine();
		for (int i = 0; i < N; i++) {
			String key = sc.nextLine();
			// 해당 제목이 처음 등장했으면
			if(map.get(key) == null) {
				map.put(key,1);	// 등장횟수 1	
			}else { // 해당 제목이 재등장했으면
				map.put(key, map.get(key)+1); // 등장횟수 + 1
			}
			
			// 만약 기존의 최대등장횟수보다 val의 등장횟수가 더 크면 새로운 최댓값으로 교체
			if(map.get(key)>MaxInt) {
				MaxInt = map.get(key);
				MaxString = key;
			}
			// 등장횟수가 동일하면 사전순으로 비교해서 최댓값 결정
			if(map.get(key) == MaxInt) {
				if(MaxString.compareTo(key)>0) {
					MaxString = key;
				}
			}
		}
		System.out.println(MaxString);
		
	}
}

기타

문제는 쉽지만 배운게 많았습니다.

  • 존재하지 않는 key값으로 get을 하면 null을 반환합니다.
  • Map의 value값을 +=1로 증가시킬 수 없고 다시 put을 해야 합니다.
    • map.put(val, map.get(val)+1);
  • String의 사전순 비교는 .compareTo()메서드를 사용할 수 있습니다.
    • S1.compareTo(S2)가 0보다 크면 S2가 사전순으로 앞선다는 의미입니다.
      • 헷갈리기 때문에 그냥 "A".compareTo("B")"B".compareTo"A" 출력해 보시길 추천합니다.

좋은 웹페이지 즐겨찾기