문제풀이/일일연습문제

[string]99클럽 코테 스터디 6일차 TIL + 백준/Bronze/27160. 할리갈리

Mo_bi!e 2024. 11. 3. 10:03

문제 설명

그림 B.1: 할리갈리

《할리갈리》는 단추가 달린 종 하나와 과일이 그려진 카드들로 구성된 보드게임입니다.

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

게임을 시작할 때 플레이어들은 카드 뭉치를 공평하게 나눠가지며 자신이 가진 카드를 전부 소모하면 패배합니다.

게임은 시작 플레이어가 본인의 카드 뭉치에서 카드 한 장을 공개하는 것으로 시작합니다. 이후 반시계 방향으로 돌아가며 본인의 카드를 한 장씩 공개합니다.

펼쳐진 카드들 중 한 종류 이상의 과일이 정확히 개 있는 경우 종을 눌러야 하며 가장 먼저 종을 누른 플레이어가 모든 카드를 모아 자신의 카드 뭉치 아래에 놓습니다. 종을 잘못 누른 경우 다른 모든 플레이어에게 카드를 한 장씩 나누어줘야 합니다.

《할리갈리》를 처음 해보는 한별이는 할리갈리 고수인 히나에게 이기기 위해 여러분에게 도움을 청했습니다. 한별이를 도와 펼쳐진 카드들의 목록이 주어졌을 때, 한별이가 종을 쳐야 하는지 알려주세요.

 

### 입력

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

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

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

 SSTRAWBERRY, BANANA, LIME, PLUM 중 하나입니다.

 

### 출력

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

 

<내 코드>

- 코드

import sys

N = int(sys.stdin.readline())
dict = {}
answer = "NO"

for i in range(N):
    S = sys.stdin.readline()
    fruit, count = S.split()
    c = int(count)

    if fruit in dict:
        dict[fruit] += c
    else :
        dict[fruit] = c

for k, v in dict.items():
    if v == 5:
        answer = "YES"

print(answer)

 

딕셔너리에 존재하는지 여부에 따라 count한 방식이 뿌듯함

 

- 반성

sys.stdin.readlin() 에다가 추가로 split()를 하면은 보다 수월하게 가능함

v == 5 일 때에 대한 break 가 없어서 반복이 되어버림

 

<모범사례>

import sys

# 입력 받기
N = int(sys.stdin.readline().strip())
fruit_counts = {}

# 각 과일의 개수를 딕셔너리에 누적
for _ in range(N):
    fruit, count = sys.stdin.readline().strip().split()
    count = int(count)
    fruit_counts[fruit] = fruit_counts.get(fruit, 0) + count

# 과일 개수가 정확히 5인 경우가 있는지 확인
answer = "NO"
for count in fruit_counts.values():
    if count == 5:
        answer = "YES"
        break  # 조건을 만족하면 더 이상 탐색하지 않고 종료

print(answer)

- 좋은점

1. split()를 한번에 함

 

<보충학습>

- 실무 예

데이터 집계, 필터링에 주로 이용이 됨

log로 이벤트 탐지, 특정 조건의 거래 검출에 유사한 로직 사용가능

 

- dict 추가 팁

.setdefault(fruit, 0) 을 이용하면 보다 수월함

 

.get() 의 기본값 이용하면 조건문을 사용안해도 됨

이렇게 하면 안정성과 함께 가독성으로 복잡하게 조건문 사용안해도 됨

fruit_counts = {}
fruit = 'STRAWBERRY'
count = 3

# 기존 값에 count를 추가하는 방식
fruit_counts[fruit] = fruit_counts.get(fruit, 0) + count

fruit_counts 에다가 존재하지않는 'STRAWBERRY' 의 count추가할 때 이렇게도 충분히 가능함