[99클럽 6일차] [백준] 27160 할리갈리

Dev.Dana·2024년 11월 2일
0

Algorithm

목록 보기
11/25
post-thumbnail

코테 스터디가 주말도 안쉬고 매일매일이었다는 사실에 새삼 놀라면서 쓰는 오늘의 TIL

[백준] 27160 할리갈리

할리갈리는 주어진 과일을 보고 과일의 개수가 딱 ! 5가 되면 종을 누르는 게임이다. 위의 문제는 한 종류의 과일의 개수가 정확히 5일 때 “YES”를 출력하고 아니면 “NO”를 출력해야한다. 🍊🍏🍓🍌

HashMap으로 풀기

일단 첫 줄의 카드를 몇 번 낼지 n이 나오고, n개의 줄에 각 과일의 이름과 개수가 공백으로 구분되어 입력된다.

처음에는 어제 문제처럼 HashMap에 담아서 풀어야겠다 라는 생각이 들었다.

< 과일 이름 - 개수 >를 키-값 쌍으로 데이터를 저장하고 한 종류라도 개수 5를 만족하는게 있다면 YES를 출력하고자 HashMap을 사용했다.

코드로 확인하기

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

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        HashMap<String, Integer> fruit = new HashMap<>();

        int n = Integer.parseInt(br.readLine());

        for (int i = 0; i < n; i++) {
            String[] input = br.readLine().split(" ");
            String fruitName = input[0];
            int quantity = Integer.parseInt(input[1]); 
            fruit.put(fruitName, fruit.getOrDefault(fruitName, 0) + quantity);
        }

        boolean bell = false;
        for (int count : fruit.values()) {
            if (count == 5) {
                bell = true;
                break; 
            }
        }

        bw.write(bell ? "YES" : "NO");
        bw.flush();
        bw.close();
        br.close();
    }
}

코드를 작성하고 제출을 해보니 정답이었지만 속도가 생각보다 느린 느낌이 들어 다른 사람들의 풀이도 찾아봤다. 내가 제출한 코드들은 왜 항상 속도면에서 떨어질까 슬퍼하면서,,

배열로 풀기

배열로 간단히 해결할 수 있는 문제였다. 과일이 계속해서 새로 생기는게 아니라 우리가 과일의 종류를 정확히 딸기, 바나나, 라임, 자두 라고 정확히 알고있지 않은가? 4개로 고정되어있는 수기 때문에 배열을 작성해서 과일 종류별로 count를 해 저장한 후 5가 되는 값이 있는지 없는지만 판별하면된다.

코드로 확인하기

import java.io.*;

public class Main {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int n = Integer.parseInt(br.readLine());
        int[] fruits = new int[4]; // 네 가지 과일 합계를 저장
        
        for(int i = 0; i < n; i++){
            String[] input = br.readLine().split(" ");
            int num = Integer.parseInt(input[1]);
            if(input[0].equals("STRAWBERRY")) {
                fruits[0] += num;
            } else if(input[0].equals("BANANA")) {
                fruits[1] += num;
            } else if(input[0].equals("LIME")) {
                fruits[2] += num;
            } else {
                fruits[3] += num;
            }
        }

        boolean bell = false;
        for (int f : fruits) {
            if (f == 5) {
                bell = true;
                break;
            }
        }

        bw.write(bell ? "YES" : "NO");
        bw.flush();
        bw.close();
        br.close();
    }
}


-> 432ms가 해시맵, 380ms가 배열이다.

왜 배열이 HashMap보다 빠를까?

  • 배열은 인덱스를 기반으로 데이터를 직접 접근하기 때문에 탐색과 데이터 저장시에 항상 O(1)이 소요된다.
  • HashMap은 해시 함수를 사용해서 키의 해시 값을 계산하고 그에 따른 데이터를 저장하기 때문에 약간의 오버헤드가 있을 수 있다…!!

만약 과일 종류가 다양한 타입이고 고정되어 있지 않다면 HashMap을 사용하는 것이 더 좋은 선택이다. 하지만 이번 문제처럼 과일 종류가 고정되어있고 미리 인덱스를 할당 할 수 있는 상황이라면 배열이 더 빠르고 메모리 측면에서도 더 효율적이다.

profile
어제의 나보단 나은 오늘의 내가 되기를

0개의 댓글