본문 바로가기
Language/Java

[백준 | Java] 27160번 할리갈리

by ㅇ달빛천사ㅇ 2025. 1. 21.
728x90
27160번 / 할리갈리

할리갈리

🏷️ 관련 주제 : 문자열 HashMap Map



💦 나의 시도

Try. HashMap을 이용한 방법

  1. BufferedReader로 펼쳐진 카드 개수를 입력 받아 int형 변환 후, int형 변수 N에 할당
  2. 결과로 출력할 문자열 ring을 "NO"로 초기화
  3. 과일 개수를 세기 위해 키-값 구조로 조회 시, 시간복잡도가 O(1)인 HashMap을 사용
    • 키 : 과일 이름
    • 값 : 과일 개수
    • Map.of()로 Map halligalli를 초기화
      • 과일 종류 : STRAWBERRY, BANANA, LIME, PLUM
      • 과일 개수 : 0
  4. 0 ~ (N - 1) 범위에서 반복문을 돌면서 StringTokenizer로 과일이름과 개수를 입력 받음.
    • fruit : 과일 이름
      • StringTokenizer에서 과일 이름을 nextToken()메서드로 가져와서 변수에 할당
    • total : 현재 과일 총 개수
      • 기존 과일 개수 : halligalli.get(fruit);
      • 새로 펼친 과일 개수 : Integer.parseInt(st.nextToken())
      • (현재 과일 총 개수) = (기존 과일 개수) + (새로 펼친 과일 개수)
    • halligallifruit키의 값을 total로 덮어쓰기
  5. halligalli의 값들 중에서 5를 포함하면 ringYES를 할당
    • halligalli.values().contains(5)
  6. BufferedWriter를 사용하여 ring을 출력

💥 컴파일 에러 : Java 버전 문제

Map.of()를 사용한 Map 생성은 Java9부터 지원
Java8 버전으로 제출하여 컴파일 에러 발생


❌ 문제 이해 : 벨을 언제 쳐야 하는가?

입력 받을 문자열이 남아 있더라도 입력받은 문자열에서 개수가 5개인 과일이 존재하면 벨을 쳐야하는 줄 알고 YES를 출력했는데
알고보니 모든 입력을 받은 후에 과일 개수가 5개인 과일이 존재할 때, YES를 출력해야 하는 것이었음.


틀린 코드
import java.util.HashMap;
import java.util.Map;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        String ring = "NO";

        Map<String, Integer> halligalli = new HashMap<>(Map.of(
            "STRAWBERRY", 0,
            "BANANA", 0,
            "LIME", 0,
            "PLUM", 0
        ));

        for (int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            String fruit = st.nextToken();
            int total = halligalli.get(fruit) + Integer.parseInt(st.nextToken());

            if (total == 5) {
                ring = "YES";
                break;
            }

            halligalli.put(fruit, total);
        }

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        bw.write(ring);
        bw.close();
    }
}

🎉드디어 성공!🎉

  • 메모리 : 39448 KB
  • 시간 : 348 ms
  • 코드 길이 : 1182 B

📑제출 기록 및 오답 원인


💯 해결 방법

import java.util.HashMap;
import java.util.Map;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        String ring = "NO";

        Map<String, Integer> halligalli = new HashMap<>(Map.of(
            "STRAWBERRY", 0,
            "BANANA", 0,
            "LIME", 0,
            "PLUM", 0
        ));

        for (int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            String fruit = st.nextToken();
            int total = halligalli.get(fruit) + Integer.parseInt(st.nextToken());
            halligalli.put(fruit, total);
        }

        if (halligalli.values().contains(5)) {
            ring = "YES";
        }

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        bw.write(ring);
        bw.close();
    }
}

🏷️ 문제 풀면서 참고한 블로그

728x90