[문제]
~~~~~ 엄청 길다 ~~~~~ 요약하자면,
카드에는 총 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 |