BOJ : 작은 수 내기 [16471]

재현·2021년 7월 4일
0
post-custom-banner

1. 문제


여자친구와 함께 보드게임카페에 간 주언이는, 여러 보드게임을 하며 데이트를 즐겼다. 3시간 커플세트로 결제를 하려던 순간, 주언이는 가격표 옆에 쓰여 있는 새로운 이벤트를 보았다.

바로 “사장님과의 게임에서 이기면 무료, 지거나 비기면 5000원 추가 지불” 이벤트였다. 보드게임에 자신이 있는 주언이는 사장님에게 게임 룰을 물어보았고, 그 룰은 다음과 같았다.

각자 N장의 카드를 받는다. (N은 홀수다)
각자 카드를 1장씩 골라서 카드에 적힌 수의 크기를 비교한다. (각 카드에 적힌 수는 0이상, 100,000이하의 정수다)
더 작은 수가 적힌 카드를 낸 사람이 1점을 얻고, 승부에 사용된 카드는 버린다. (무승부의 경우, 둘 다 점수를 획득하지 못한다)
총 N번의 승부 후, (N+1)/2점 이상의 점수를 획득한 사람이 승리한다.
(N+1)/2점 이상의 점수를 획득한 사람이 없을 경우, 승자가 없는 것으로 게임이 끝난다.
주언이는 자신이 이길 확률이 조금이라도 있을 경우 게임을 하고자 한다.

사장님이 받은 카드에 적힌 수들과, 주언이가 받은 카드에 적힌 수들이 주어질 때, 주언이가 게임을 해도 되는지 확인하자.

출처 : https://www.acmicpc.net/problem/16471

2. 아이디어


  • mine (시간 초과❗)
    1. 사장님과 주언이의 카드를 오름차순으로 정렬한다.
    2. 사장님의 첫번째 카드부터 꺼내어 주언이가 사장님보다 큰 카드가 최초로 나올 때까지 탐색한다. 나온다면 주언이의 해당 카드를 pop시키고 승점을 올린 후 다음 탐색을 진행한다.
    3. 탐색이 끝났는데도 주언이의 승점이 없다면 무승부거나 패배이므로 사장님의 승점을 올린다.
    4. 주언이의 승점이 전체 카드의 중간값보다 많다면 YES 출력
    5. 아니면 NO
  • clone
    1. 사장님의 중간 이후 값과 주언이의 중간 이전 값을 비교하여 카운트값이 카드 개수의 절반 초과이면 YES, 아니면 NO

3. 코드


mine

import sys
input = sys.stdin.readline
n = int(input())
ceo_win = 0
jueon_win = 0
win = False
ceo = list(map(int, input().split()))
jueon = list(map(int, input().split()))
ceo.sort()
jueon.sort()
for i in range(len(ceo)):
  past_jueon_win = jueon_win
  for j in range(len(jueon)):
    if ceo[i] < jueon[j]:
      jueon_win += 1
      jueon.pop(j)
      break
  if past_jueon_win == jueon_win:
    ceo_win += 1
  if jueon_win > int(n/2):
    print('YES')
    win = True
    break
if not win:
  print('NO')

clone

import sys

n = int(input())
juon = list(map(int, sys.stdin.readline().split()))
sajang = list(map(int, sys.stdin.readline().split()))

juon.sort()
sajang.sort()

cnt = 0

for i in range(n // 2 + 1):
    if juon[i] < sajang[n // 2 + i]:
        cnt += 1

if cnt > n // 2:
    print("YES")
else:
    print("NO")

출처 : https://github.com/mori8/baekjoon-algorithm-python/commit/a1282322f59c87abbcf0b01618975a2aea2381b3

profile
성장형 프로그래머
post-custom-banner

0개의 댓글