coding_test

[99클럽 4기 코테 스터디 TIL 6일차] 할리갈리 (feat. 해시맵, BufferedReader, Bufferedwriter, HashMap.containsValue())

jeri 2024. 11. 2. 20:43
반응형

https://www.acmicpc.net/problem/27160

 

 

1) 내가 구현한 코드

  • 과일의 종류 상관없이 입력받은 과일만큼 과일의 갯수가 업데이트 되도록 구현함
import java.util.*;
import java.lang.*;
import java.io.*;

class Main {
    public static void main(String[] args) throws Exception{

        // List temp = List.of("123", "123123");
        // System.out.println(temp);
            
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

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

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

        for(int i=0; i<N; i++){
            String[] fruits = br.readLine().split(" ");
            //System.out.println(fruits);
            int cnt = map.getOrDefault(fruits[0],0)+Integer.parseInt(fruits[1]);
            map.put(fruits[0],cnt);       
        }

        // System.out.println(map);
        String answer = "NO";
        /*
        for(Integer cnt : map.values()){
            if(cnt == 5) {
                answer ="YES";
            }
        }
        */
		if (map.containsValue(5)) {
                answer ="YES";
    	}
            
        bw.write(answer);
        bw.flush();
        
        br.close();
        bw.close();
    }
}

 

 

2) 오늘의 학습 키워드

  • 해시맵을 통한 데이터 관리
  • 조건문 사용하여 특정 조건 확인하기
  • 시간 복잡도 개선

 

 

3) 문제 이해

이 문제는 보드게임 할리갈리의 룰을 이용하여,

펼쳐진 카드 중 특정 과일의 개수가 정확히 5개일 때 종을 쳐야 한다는 조건을 코드로 구현하는 것이다.

목표는 카드 목록을 순회하며 조건을 만족하는 과일이 있는지 확인하는 것이다.

 

 

4) 문제 해결 과정

1. 문제 접근 :

  • 각 과일 종류의 개수를 저장하기 위해 HashMap을 사용한다.
  • 카드 정보를 읽고 해당 과일의 총 개수를 업데이트한 후,
    개수가 정확히 5가 되는 시점에 “YES”를 출력하고 즉시 종료한다.
  • 카드를 모두 확인했는데도 조건을 만족하는 과일이 없다면 "NO"를 출력한다.

2. 해결 과정 :

  • 해시맵 초기화: 딸기, 바나나, 라임, 자두 각각의 개수를 0으로 초기화하여 과일별 개수를 추적한다.
  • 반복문을 통한 개수 업데이트: 각 카드 정보를 읽어들여 과일의 총 개수를 업데이트한다.
  • 조건 확인: 개수를 더할 때마다, 과일의 총 개수가 정확히 5가 되었는지 확인하여 조건을 만족하면 즉시 "YES"를 출력한다.
  • 최종 출력: 조건을 만족하는 과일이 없을 경우, “NO”를 출력한다.

3. 추가 구현 코드 :

import java.util.HashMap;
import java.util.Scanner;

public class HalliGalli {
    public static String shouldRingBell(int n, String[][] cards) {
        // 해시맵을 이용해 과일별 개수를 관리
        HashMap<String, Integer> fruitCounts = new HashMap<>();
        fruitCounts.put("STRAWBERRY", 0);
        fruitCounts.put("BANANA", 0);
        fruitCounts.put("LIME", 0);
        fruitCounts.put("PLUM", 0);

        // 카드 목록을 순회하며 과일 개수 업데이트
        for (int i = 0; i < n; i++) {
            String fruit = cards[i][0];
            int count = Integer.parseInt(cards[i][1]);

            // 현재 과일 개수를 업데이트
            fruitCounts.put(fruit, fruitCounts.get(fruit) + count);

            // 과일 개수가 정확히 5개가 되는 경우 "YES" 반환
            if (fruitCounts.get(fruit) == 5) {
                return "YES";
            }
        }
        
        // 조건을 만족하는 과일이 없는 경우 "NO" 반환
        return "NO";
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 입력 받기
        int n = scanner.nextInt();
        scanner.nextLine();  // 줄바꿈 처리

        String[][] cards = new String[n][2];
        for (int i = 0; i < n; i++) {
            cards[i][0] = scanner.next();
            cards[i][1] = scanner.next();
        }

        // 결과 출력
        System.out.println(shouldRingBell(n, cards));
    }
}
 

5) 새로운 배움

  • HashMap을 사용하여 데이터를 효율적으로 관리할 수 있는 방법을 익혔다.
  • 이를 통해 각 과일의 개수를 빠르게 업데이트하고 확인할 수 있어 시간 복잡도를 최소화할 수 있었다.
  • 조건을 충족하면 반복문을 종료함으로써, 불필요한 연산을 줄이고 코드의 효율성을 높일 수 있다는 점을 배웠다.

 

6) 내일의 학습 목표

  • 해시맵을 활용한 데이터 관리의 심화 학습
  • 다양한 조건의 문제에 대해 시간 복잡도를 고려한 최적화 연습
  • 복잡한 조건을 효율적으로 구현하는 연습

 

7) 추가 문제

미들러 - 나무자르기

https://www.acmicpc.net/problem/2805

챌린저 - 키 순서

https://www.acmicpc.net/problem/2458

 

반응형
댓글수0