본문 바로가기

개발일지/TIL

TIL 23-07-11 백준 게시판 반례 찾기

1.백준 - 팀 이름 정하기

 문제점

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

https://www.acmicpc.net/board/view/121576

 시도해 본 것들

코드 이해하기

name = input()
L, O, V, E = 0, 0, 0, 0
# 연두의 영어 이름 단어 개수 파악
for x in name:
    if x == 'L':
        L += 1
    elif x == 'O':
        O += 1
    elif x == 'V':
        V += 1
    elif x == 'E':
        E += 1
LOVE = [L, O, V, E]
k = int(input())
maxScore = 0
fTeamName = ''

# 팀 후보 이름 단어 개수 파악 
for i in range(k):
    teamName = input()
    for x in teamName: 
        if x == 'L':
            L += 1
        elif x == 'O':
            O += 1
        elif x == 'V':
            V += 1
        elif x == 'E':
            E += 1
    # 점수 계산 공식 
    score = ((L+O) * (L+V) * (L+E) * (O+V) * (O+E) * (V+E)) % 100
    count = 0
    # 최고 점수 파악 분기문 
    if score > maxScore:
        fTeamName = teamName
    # 점수가 같은 경우 사전순 정렬을 위한 분기문 
    elif score == maxScore:
        for i in range(min(len(teamName), len(fTeamName))):
            if ord(teamName[i]) != ord(fTeamName[i]):
                if ord(teamName[i]) < ord(fTeamName[i]):
                    fTeamName = teamName 
                count = 1
                break
        # 모든 비교 단어가 일치하지만 길이가 더 긴 게 존재하는 경우 파악 
        if count == 0:
            if len(teamName) < len(fTeamName):
                fTeamName = teamName 
        if fTeamName == '':
            fTeamName = teamName
    L, O, V, E = LOVE
print(fTeamName)

풀었던 문제였기 때문에 다른 사람의 코드였지만 금방 코드를 확인하고 이해할 수 있었다. 

 

문제 찾기 

 문제가 발생하는 경우를 찾기위해 예제를 확인해본 결과 

예제 1번에서 잘못된 출력을 보여주는 것을 확인

print(score)를 추가한 뒤 확인했을 때 

16
64
16
DANO

다음과 같이 64인 FRANK가 정답으로 출력되어야 하지만 DANO가 출력되는 것을 확인할 수 있었다. 

 해결 방법

 확인한 반례를 바탕으로 코드를 다시 살펴보자 현재 코드에서 maxScore를 갱신하지 않기 때문에

score가 1이 넘는다면

if score > maxScore:
        fTeamName = teamName

분기문을 진입하고 

LOVE
3
JACOB
FRANK
DANO

예제 1번을 입력했을 때 DANO를 출력하는 것을 확인할 수 있었다.

 알게 된 점

게시판에서 반례를 찾는 과정이 사실 질문자보다 답변을 하는 사람이 디버깅 과정을 거치고 타인의 코드를 이해하며 크게 성장할 수 있는 기회가 아닐까 싶다. 

그리고 내가 공부한 부분으로 다른 사람을 도와줄 수 있다는 점이 장점인 것 같다. 

 

1.세로읽기

 문제점

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

https://www.acmicpc.net/board/view/121612

 시도해 본 것들

코드 파악

from sys import stdin as s
# 이중 for문 생성 
lst = [s.readline().strip()]
# 총 5번 입력이 존재하므로 for문으로 list 추가 
for i in range(4):
    lst.append(f'{s.readline().strip():<{len(lst[0])}}')
# list[0]의 길이로 for문 진행 
for i in range(len(lst[0])):
	# 5번 for문 진행 
    for j in range(len(lst)):
    	# 공백이 아니면 출력
        if lst[j][i] != " ":
            print(lst[j][i], end="")
        else:
            continue

이 번 코드는 길지 않아서 문제가 발생할 수 있는 부분을 예측할 수 있었다. 

 

 해결 방법

입력 :
AABCDD
afzz
09121
a8EWg6
P5h3kxAABCDD

출력 :
Aa0aPAf985Bz1EhCz2W3D1gkD6x

정답 :
Aa0aPAf985Bz1EhCz2W3D1gkD6xAABCDD

현재 코드에서 7번째 줄의 for문 범위 설정이 

for i in range(len(lst[0])):

list[0]의 길이로 설정되어 있어 이것보다 긴 리스트의 뒷부분이 무시되는 케이스가 존재했다. 

 알게 된 점

python에서 만나게 되는 실수와 조금 친해지며 금방 파악할 수 있었다.