본문 바로가기
백준

[백준] 알고리즘 분류(문자열,JAVA)1302번, 베스트셀러

by 열정적인 이찬형 2022. 10. 7.

문제 링크

 

1302번: 베스트셀러

첫째 줄에 오늘 하루 동안 팔린 책의 개수 N이 주어진다. 이 값은 1,000보다 작거나 같은 자연수이다. 둘째부터 N개의 줄에 책의 제목이 입력으로 들어온다. 책의 제목의 길이는 50보다 작거나 같고

www.acmicpc.net


주의사항

  • JAVA를 사용하여 프로그램을 사용하였습니다.
  • 백준에서 코드를 작성하였을 때 아래 형태에서 Main에서 결과가 출력되어야 합니다.
public class Main{ 	
	public static void main(String[] args){
    }
}

문제 설명


접근 방법

이 문제에 핵심

 

1. N개의 책의 제목에서 가장 많이 팔린 책의 제목을 결과로 출력합니다.

2. 팔린 양이 같을 때에는 사전 순으로 더 빠른 책의 제목을 결과로 출력합니다.

3. 책의 제목은 소문자이며 길이는 50보다 작습니다.

 

알고리즘 진행 순서.

 

1. 입력된 책의 정보를 저장합니다.

 

2. 책을 구매한 횟수가 가장 큰 책의 제목을 사전 순으로 빠른 것을 구합니다.

 

3. 책의 제목을 출력합니다.

 

구매한 횟수 비교하기.

 

저는 HashMap<String, Integer>를 이용하여 각 제목에 대하여 구매한 횟수를 저장하였습니다.

 

"abc", "bca", "abc"를 구매하였을 때 HashMap에는 아래와 같이 저장됩니다.

abc 2
bca 1

 

모든 책의 제목을 저장한 뒤 구매한 횟수를 비교해서 최대 구매한 책의 제목을 구합니다.

 

예제입력 2.

 

1. 입력된 책의 정보를 저장합니다.

 

N : 9

table
chair
table
table
lamp
door
lamp
table
chair

 

2. 책을 구매한 횟수가 가장 큰 책의 제목을 사전 순으로 빠른 것을 구합니다.

table 4
chair 2
lamp 2
door 1

 

구매한 횟수가 가장 많은 책의 제목 : table(4)

 

3. 책의 제목을 출력합니다.

 

table 결과로 출력합니다.

 

  • BufferedReader를 사용하여 입력되는 정보를 저장합니다.
  • 입력되는 책의 제목들에 대하여 HashMap을 통해서 구매한 횟수를 저장하였습니다.
  • 각 책의 제목에 대하여 구매 횟수 비교하여 최대 구매한 횟수에 책을 구합니다.
  • 최대 횟수를 구매한 책의 제목을 BufferedWriter 저장하였습니다.
  • BufferedWriter에 저장된 결과값을 출력하였습니다.

 

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;


public class Main {
    static HashMap<String, Integer> map = new HashMap<>();	//책 구매 횟수 저장 Map
    static int N, max = Integer.MIN_VALUE;
    static String answer = "";
    public static void main(String[] args) throws IOException{
        //입력값 처리하는 BufferedReader
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //결과값 출력하는 BufferedWriter
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        N = Integer.parseInt(br.readLine());
        //입력되는 책의 제목 Map에 저장
        for(int i=0;i<N;i++){
            String str = br.readLine();
            if(map.containsKey(str))
                map.put(str, map.get(str) + 1);
            else
                map.put(str, 1);
        }
        //각 책의 제목에 대하여 구매한 횟수 가장 큰 책 구하기
        for(String key : map.keySet()){
            //구매한 횟수가 현재 최대값보다 큰 책인 경우
            if(map.get(key) > max){
                answer = key;
                max = map.get(key);
            }
            //최대값과 같은 경우 사전 순 더 빠른 책의 제목 비교하기
            else if(map.get(key) == max){
                ArrayList<String> list = new ArrayList<>();
                list.add(answer);
                list.add(key);
                Collections.sort(list);		//정렬
                if(list.get(0).equals(key))
                    answer = key;
            }
        }
        bw.write(answer + "");	//최대 구매 책의 제목 BufferedWriter 저장
        bw.flush();		//결과 출력
        bw.close();
        br.close();
    }
}

댓글