본문 바로가기
문제 풀이/백준

[Python] 백준 5747 - Odd or Even

by JJong | 쫑 2022. 5. 8.

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

클릭시 문제 사이트로 이동


 

문제
'홀짝' 게임에는 여러가지 방식이 존재한다. 그중 한가지 방법은 두 사람이 각자 '홀수', '짝수' 중 하나를 말한다. 그러고서 셋을 센다('셋, 둘, 하나!'). '하나!'에서 두 사람은 한 손으로 0부터 5까지의 수를 손가락의 개수로 표현한다. 만약 두 사람이 내민 손가락의 수를 세었을 때 합이 짝수라면 처음 짝수를 외친 사람이 승리하고, 반대로 홀수라면 처음 홀수를 외친 사람이 승리한다.

존과 매리는 이 홀짝 게임을 몇 판하려고 한다. 홀수를 좋아하는 존은 모든 판에서 홀수를 고르기로 했고, 매리는 짝수를 고르기로 했다. 존과 매리는 각 경기의 카드를 보면서 나중에 결과를 다시 확인하기 위해 게임을 하는 동안 각자의 카드에 자신이 내민 숫자를 적기로 했다. 그런데 게임에서 질 것 같은 존은 막판에 카드를 섞어버렸다!

섞인 카드들로 매리가 반드시 이기는 판이 최소 몇 개인지 프로그램을 작성해주자.

입력
첫째줄에는 홀짝 게임을 한 횟수를 나타내는 정수 N을 입력받는다. 둘째줄에는 매리가 낸 수들을 입력받는다. 셋째줄에는 존이 낸 수들을 입력받는다. N=0을 입력받을 때까지 반복한다.

출력
매리가 반드시 이기는 판이 최소 몇 개인지 출력하라.

 

위는 문제에 불필요한 이야기는 빼고, 필요한 이야기만 번역해보았습니다. 제 입맛대로 번역한 것이기에 더 자세히는 직접, 혹은 번역기의 힘을 빌려보시기 바랍니다..!


해결방법

이 문제는 모든 판에서 홀수가 되는 경우(존이 이기는 경우)를 빼주는 방법으로 풀었다.

다시말해 홀수가 되는 경우, 즉 홀+짝(or 짝+홀)인 경우를 떠올리면 풀었다.

문제에 주어진 예제를 통해 이해해보자.

 

(입력) 9
(입력,Mary) 0 2 2 4 2 1 2 0 4
(입력,John) 1 2 3 4 5 0 1 2 3

(정답) 3

 

9가 의미하는 것은 매리 혹은 존이 한 게임의 판 수이다.

 

  • 매리: 홀수가 1개, 짝수가 8개
  •   존 : 홀수가 5개, 짝수가 4개

매리가 가진 홀수와 존이 가진 짝수로, 또한 매리가 가진 짝수와 존이 가진 홀수로 홀수를 만들 수 있다. 이때 최대로 만드는 경우는 9-(1+5)=6 인데 '게임한 횟수 - min(매리홀수, 존짝수) - min(매리짝수, 존홀수)' 라는 식을 세워서 풀이하였다. (단, min(10,5) == 5 이다.)


# mary : blue card, 짝수.
# 홀수를 만드는 방법 : 홀+짝 or 짝+홀
def count_odd(arr):
  cnt = 0
  for i in arr:
    if i%2==1:
      cnt+=1
  return cnt

while True:
  n = int(input())
  if n == 0:
    break
    
  else:
    Mary = list(map(int,input().split()))
    John = list(map(int,input().split()))

    odd_m = count_odd(Mary)
    even_m = n - odd_m

    odd_j = count_odd(John)
    even_j = n - odd_j

    ans = n - min(odd_m, even_j) - min(odd_j, even_m)
    print(ans)

코드 설명

무한 루프 안에서 코드를 실행합니다. 탈출조건은 게임한 횟수를 0으로 입력한 경우입니다.

매리와 존이 낸 숫자를 리스트로 입력받습니다.

매리가 낸 숫자들 중에서 홀수의 개수와 짝수의 개수를 구해줍니다.

존도 마찬가지로 구해줍니다.

아까 만들었던 식으로 정답을 구하고, 출력합니다.


성공!

 

댓글