99클럽 코테 스터디 6일차 TIL + 할리갈리
- 오늘의 학습 키워드 : HashMap, getOrDefault("key", 0), map.values(), flag
[백준 27160] 할리갈리
문제
1 초 | 1024 MB | 3763 | 2410 | 1931 | 64.820% |
《할리갈리》는 단추가 달린 종 하나와 과일이 그려진 카드들로 구성된 보드게임입니다.할리갈리카드에는 총 4종류의 과일이 최대 5개까지 그려져 있습니다. 그려진 과일의 종류는 딸기, 바나나, 라임, 그리고 자두입니다.게임을 시작할 때 플레이어들은 카드 뭉치를 공평하게 나눠가지며 자신이 가진 카드를 전부 소모하면 패배합니다.게임은 시작 플레이어가 본인의 카드 뭉치에서 카드 한 장을 공개하는 것으로 시작합니다. 이후 반시계 방향으로 돌아가며 본인의 카드를 한 장씩 공개합니다.펼쳐진 카드들 중 한 종류 이상의 과일이 정확히 5개 있는 경우 종을 눌러야 하며 가장 먼저 종을 누른 플레이어가 모든 카드를 모아 자신의 카드 뭉치 아래에 놓습니다. 종을 잘못 누른 경우 다른 모든 플레이어에게 카드를 한 장씩 나누어줘야 합니다.《할리갈리》를 처음 해보는 한별이는 할리갈리 고수인 히나에게 이기기 위해 여러분에게 도움을 청했습니다. 한별이를 도와 펼쳐진 카드들의 목록이 주어졌을 때, 한별이가 종을 쳐야 하는지 알려주세요.
입력
- 첫 번째 줄에 펼쳐진 카드의 개수 N이 주어집니다.
- 두 번째 줄부터 N개의 줄에 걸쳐 한 줄에 하나씩 펼쳐진 카드의 정보가 주어집니다.
- 카드의 정보는 공백으로 구분된, 과일의 종류를 나타내는 문자열 S와 과일의 개수를 나타내는 양의 정수 X로 이루어져 있습니다.
- S는 STRAWBERRY, BANANA, LIME, PLUM 중 하나입니다.
출력
한별이가 종을 쳐야 하면 YES을, 아니면 NO를 출력해주세요.
제한
- 1 ≤ N ≤ 100,000
- 1 ≤ X ≤ 5
- 입력으로 주어지는 모든 수는 정수입니다.
예제 입력/출력
예제 입력 1
3
BANANA 2
PLUM 4
BANANA 3예제 출력 1
YES예제 입력 2
4
STRAWBERRY 1
BANANA 2
LIME 3
PLUM 4예제 출력 2
NO예제 입력 3
2
LIME 5
LIME 1예제 출력 3
NO예제 입력 4
2
BANANA 5
BANANA 5예제 출력 4
NO
- 오늘의 회고
- 어떤 문제가 있었고, 나는 어떤 시도를 했는지
할리 갈리 문제로 과일이름을 Key로 개수를 value로 저장하여 문제를 해결하려고 하였음
근데 map의 경우 키는 중복될 수 없다.
map.put()을 통해서 같은 키에 값을 넣으면 키의 값이 중복되지 않기 때문에 value의 값이 변경됨
- 어떻게 해결했는지
1. getOrDefault("key", 0)을 통해서 안에 값이 있으면 + 연산이되고 값이 없으면 0으로 디폴트값을 줌
그리고
2. for문을 통해서 value의 값이 5일 경우 YES를 출력, 아니면 NO를 출력
3. 하지만 for문을 돌리기 위해서는 횟수를 알아야 하는데, 중복된 키를 더하기로 연산을 하였기 떄문에
정확히 알수 없음 그래서
map.value()나
for (Map.Entry<String, Integer> entry : map.entrySet()) 을 사용해서
String key = entry.getKey();
Integer value = entry.getValue();
를 통해서 반복문을 사용할 수 있음
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
public class BOJ27160_할리갈리 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
Map<String,Integer> hm = new HashMap<>();
int N = Integer.parseInt(st.nextToken());
boolean flag = false;
for(int i =0; i < N; i++){
st = new StringTokenizer(br.readLine());
String fruit = st.nextToken();
int fruitNum = Integer.parseInt(st.nextToken());
hm.put(fruit, hm.getOrDefault(fruit, 0) + fruitNum);
}
for(Integer num: hm.values()){
if(num == 5) {
System.out.println("YES");
flag = true;
break;
}
}
if(!flag) System.out.println("NO");
br.close();
}
}