HashMap으로 알고리즘 문제를 해결하는 방법에 대해 제가 모르는 부분을 명확히 하고자 합니다.
https://www.acmicpc.net/problem/1302
(문제)
김형택은 탑문고 직원이다. 김형택은 계산대 계산원이다. 김형택은 그날 퇴근 후 오늘 팔린 책의 제목을 보고 가장 잘 팔린 책의 제목을 칠판에 적는다.
(기입)
첫 번째 줄은 N에게 하루 동안 판매된 책의 수를 제공합니다. 이 값은 1,000보다 작거나 같은 자연수입니다. 두 번째 줄부터는 책 제목을 N줄로 입력한다. 책 제목의 길이는 50자 이하로 알파벳 소문자로만 구성한다.
(누르다)
베스트셀러 책의 제목을 첫 줄에 인쇄하십시오. 베스트셀러 책이 여러 권 있는 경우 알파벳 순서로 먼저 오는 제목을 인쇄하십시오.
(설명)
1. 해시맵(HashMap) 사용
2. 해시맵의 키 값으로 책 제목을 입력합니다.
3. 해쉬맵의 값은 책명이 입력될 때마다 1씩 증가합니다.
4. 모든 항목을 수신한 후 값이 가장 큰 항목을 찾습니다.
5. 값이 같으면 문자열 비교를 통해 알파벳순으로 키가 먼저 옵니다.
(입장)
1. 책 제목에 해당하는 값을 입력하고 그 값에 해당하는 번호를 알고 있어야 합니다.
2. 배열을 하나하나 생성하는 것이 번거로우므로 그룹화 및 관리가 가능한 HashMap을 사용한다.
3. HashMap에 입력된 값을 반복하여 가장 큰 값을 가진 것을 찾는다.
4. 값이 같으면 가장 빠른 것을 알파벳순으로 출력하라는 문제이므로 문자열을 비교하여 가장 작은 것을 출력할 수 있습니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
public class B_1302 {
public static void main(String() args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int size = 0; // 정답의 개수
String result = ""; // 정답 문자열
HashMap<String, Integer> map = new HashMap<>();
for(int i = 0 ; i < N; i++){
String str = br.readLine();
// 이미 있는 단어라면 해당 단어의 값을 1 증가
if(map.containsKey(str)){
map.put(str, map.get(str) + 1);
}
// 없다면 새로 만들어서 1로 담는다.
else {
map.put(str, 1);
}
}
// 가장 많이 나온 것 찾기
for(String key : map.keySet()){
if(size < map.get(key)){ // 현재 결과의 개수보다 많으면
size = map.get(key); // 개수를 변경
result = key; // 정답을 변경
}
else if(size == map.get(key)){ // 현재 결과의 개수와 같다면
if(result.compareTo(key) > 0){ // 문자열 비교를 통해
result = key; // 사전순으로 더 빠른 경우 변경
}
}
}
System.out.println(result);
}
}
참조 블로그:
https://blackvill.39
