// Google Adsense

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

 

14696번: 딱지놀이

표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 딱지놀이의 총 라운드 수를 나타내는 자연수 N이 주어진다. N 은 1 이상 1,000 이하이다. 다음 줄에는 라운드 1에서 어린이 A가 내는 딱지에 나

www.acmicpc.net

 

 

🔥 처음 작성코드 (32점)

import sys
input = sys.stdin.readline

N = int(input())

for _ in range(N):
    ac = list(map(int, input().split()))
    bc = list(map(int, input().split()))

    acc = [0] * 4
    bcc = [0] * 4
    for i in range(1, ac[0]+1):
        acc[ac[i]-1] += 1

    for i in range(1, bc[0]+1):
        bcc[bc[i]-1] += 1

    na = int(''.join(str(x) for x in acc[::-1]))
    nb = int(''.join(str(x) for x in bcc[::-1]))

    if na > nb:
        result = 'A'
    elif nb > na:
        result = 'B'
    else:
        result = 'D'

    print(result)

 

⭕ 해설

  1. 문제가 너무 쉽다고 생각했다가 32점을 받았습니다...
  2. 일단 ac, bc 리스트에 a,b의 카드정보를 받아주었습니다.
  3. 그 다음 각각 별, 동그라미, 네모, 세모의 카드 수를 카운팅할 acc, bcc를 만들었습니다.
  4. ac와 bc에서 카드 개수정보가 들어있는 0자리를 제외하고 나머지를 돌며 acc, bcc를 늘려주었습니다.
  5. 그 다음 acc, bcc를 거꾸로 뒤집어 정수로 변환시켰습니다.
    • 정수로 바뀐 na, nb는 각각 카드에 그려진 모양의 개수를 나타냅니다.
    • 천의 자리에 별의 개수
    • 백의 자리에 동그라미의 개수
    • 십의 자리에 네모의 개수
    • 일의 자리에 세모의 개수
  6. 그래서 이 두 수를 비교하여 큰 쪽이 이기고, 같을 때 비기는 것이라 생각하고 코드를 작성했습니다.

 

 

🚨 이 코드가 틀린 이유

 

하나의 모양이 10개 이상인 경우를 고려하지 못하였습니다.

만약 a는 카드에 별 하나가 그려져있고, b는 카드에 동그라미 열 개가 그려져있으면 경기는 a가 승리합니다.
하지만 제 코드에서는 na = 1000, nb = 1000 으로 비긴 결과를 출력하게 됩니다.
그래서 acc, bcc => na, nb 의 과정을 삭제하고, 리스트에서 원소를 하나씩 꺼내어 비교하는 코드로 변경하였습니다.

 

 

🔥 수정코드 (100점)

import sys
input = sys.stdin.readline

N = int(input())
result = []
for _ in range(N):
    ac = list(map(int, input().split()))
    bc = list(map(int, input().split()))

    acc = [0] * 4
    bcc = [0] * 4
    for i in range(1, ac[0]+1):
        acc[ac[i]-1] += 1

    for i in range(1, bc[0]+1):
        bcc[bc[i]-1] += 1

    for i in range(4)[::-1]:
        if acc[i] > bcc[i]:
            result = 'A'
            break
        elif acc[i] < bcc[i]:
            result = 'B'
            break
    else:
        result = 'D'

    print(result)

+ Recent posts