데블 아니고 데블리

운동,햄버거, 개발 좋아요

🐷💻📝

알고리즘

[백준_27160] 할리갈리

데블아니고데블리 2024. 3. 28. 16:54

[문제]

~~~~~ 엄청 길다 ~~~~~ 요약하자면,

카드에는 총 4종류의 과일이 최대 5개까지 그려져 있습니다. 그려진 과일의 종류는 딸기, 바나나, 라임, 그리고 자두입니다.

펼쳐진 카드들 중 한 종류 이상의 과일이 정확히 5 있는 경우 종을 눌러야 하며

한별이를 도와 펼쳐진 카드들의 목록이 주어졌을 때, 한별이가 종을 쳐야 하는지 알려주세요.

 

(설명 엄청 긴데, 펼처진 카드에서 같은 과일 5개이면 종친다 이말이여)

 

[입력]

첫 번째 줄에 펼쳐진 카드의 개수 N이 주어집니다.

두 번째 줄부터 N개의 줄에 걸쳐 한 줄에 하나씩 펼쳐진 카드의 정보가 주어집니다.

카드의 정보는 공백으로 구분된, 과일의 종류를 나타내는 문자열 S와 과일의 개수를 나타내는 양의 정수 X로 이루어져 있습니다.

 S는 STRAWBERRY, BANANA, LIME, PLUM 중 하나입니다.

 

[출력]

한별이가 종을 쳐야 하면 YES를 아니면 NO를 출력해주세요.

 

[입력 예시 /  출력예시]


3
BANANA 2
PLUM 4
BANANA 3
===========
YES

4
STRAWBERRY 1
BANANA 2
LIME 3
PLUM 4
===========
NO

2
LIME 5
LIME 1
===========
NO

 

 

카드가 N장 깔린 것 중에서 같은 종류의 과일 합이 5인 것 찾기

1. 맵 선언

2. 입력받은 문자열 공백문자 찾아 String 배열에 임시저장

3. 맵 안에 같은 과일이름 있으면 과일 더해서 덮어쓰기, 아니면 과일, 개수 맵에 저장

4. 합이 5인 과일이 있으면 YES, 아니면 NO 출력 


package src.com.company.day2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;

public class BJ_27160_할리갈리 {
    public static void main(String[] args) throws IOException {

        // map을 사용한 풀이 : 편하게 풀어봤다
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // 펼처진 카드의 개수 = 게임하는 사람의 수라고 생각하고 풀었다
        int N = Integer.parseInt(br.readLine());

        /** 과일 : 개수로 이루어 진 카드니까 맵을 생각했다(편하게 풀기) :
         * key(과일 이름)가 같은 value(개수)의 합이 5이면 yes, 아니면 no 출력
         */

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

        for(int i = 0; i < N; i++) {
            // 반복을 돌면서 공백문자 찾는다 -> key, value 넣기
            //cards[0] : 과일,   cards[1] : 숫자
            String[] cards = br.readLine().split(" ");
            // 같은 과일이 있는지 찾기
            if(fruit.containsKey(cards[0])){
                // 같은 과일이 있으면 기존 값에다가 누적합 해주기
                fruit.put(cards[0], fruit.get(cards[0]) + Integer.parseInt(cards[1]));
            }
            else {
                fruit.put(cards[0], Integer.parseInt(cards[1]));
            }
        }
        // 이렇게 반복문으로 카드값 정리가 끝나면 과일맵에서 value(개수)가 5개 인지 찾는다.
        if(fruit.containsValue(5)) {
            System.out.println("YES");
        } else {
            System.out.println("NO");
        }

    }
}

코드와 주석을 보고도 이해가 가지 않는다면... 더 자세한 풀이

1. 과일의 종류와 개수로 이루어 진 카드니까 map을 생각했다

 

(1번 예시로 풀이법 작성했다.)

2. bufferedReader()로 입력된 문자열에서 반복문을 돌면서 공백문자를 찾는다

cards[0] = "BANANA"

cards[1] = "2"

 

3. 과일의 종류를 key로 개수를 value로 하여 key가 같으면 value를 더해준다 (어챠피 맵은 key값 같으면 마지막값으로 덮어쓰기 하니까)

그 후 맵에 넣어준다.

key = "BANANA" value = 2

 

4. 다시 순회하면서 반복한다 

cards[0] = "PLUM"

cards[1] = "4"

 

fruit에는 "BANANA", "PLUM" 이 생기고 이 안에 각각 2, 4 라는 값이 생긴다.

 

5. 한번 더 순회하면 if 문을 탄다 왜냐고 ? 

cards[0] = "BANANA"

cards[1] = "3"

 

이미 key값이 BANANA인게 있기 때문이지!

그렇다면 원래 있던 값 2에다가 3을 누적합해서 맵에는 key = "BANANA", value = 5 가 남는다

 

자 이제는 배열 다 돌았으니 5인거 찾아서 출력하면 땡!

 

'알고리즘' 카테고리의 다른 글

[백준_2293] 동전 1  (0) 2024.04.16
[백준_8911] 거북이  (0) 2024.04.11
[기타] 자바로 조합 구현하기(with 공주 옷입히기)  (0) 2024.04.11
[백준_1152] 단어의 개수  (0) 2024.03.28