HwangHub
[백준 / python] #15820 맞았는데 왜 틀리죠? 본문
15820번: 맞았는데 왜 틀리죠?
'테스트케이스(TestCase)'란 사용자가 제출한 코드가 옳은 답을 출력하는지 판단하기 위한 데이터다. 한 문제는 여러 개의 테스트케이스를 가지며, 문제를 '맞았다'는 것은 해당 문제의 모든 테스
www.acmicpc.net
문제 풀이:
주어진 값들을 간단하게 비교해주면 되는 문제였다.
첫 번째 시도:
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
sample_right = True
system_right = True
# sample case
for i in range(n):
a, b = input().split()
print(a == b)
sample_right = (a == b)
if system_right == False:
print("break")
break
for j in range(m):
c, d = input().split()
print(c == d)
system_right = (c == d)
if system_right == False:
print("break")
break
print(f"sample right : {sample_right}")
print(f"system right : {system_right}")
# 모두 정답인 경우
if sample_right and system_right:
print("Accepted")
elif not sample_right:
print("Wrong Answer")
elif sample_right and not system_right:
print("Why Wrong!!!")
else:
print("???")
샘플케이스와 시스템 케이스의 정답 여부를 boolean 변수로 선언해두고, 각 케이스를 loop에서 입력받으면서 그 자리에서 비교, 만약 샘플 케이스 또는 시스템 케이스가 틀리는 순간이 오면 boolean을 False로 하고 그 루프를 탈출한다. 이후 끝에서 boolean 변수들을 체크하면서 정답 여부를 확인하고 특정 값을 출력하게끔 하였다.
입력 받는 과정에서 어차피 loop를 사용해야 한다면, 그 루프 안에서 if 를 돌려서 boolean값을 체크해두는게 효율적일 것이라 판단하였다. 따라서 loop안에서 boolean값을 계속 체크하고, 만약 틀린 답이 입력될 경우 바로 탈출하게끔 로직을 구성하였다.
사실 마지막 정답 여부 조건문 또한 엉망진창이지만, 무엇보다 loop문 안에서 내가 원하는대로 답 체크가 원활히 이루어지지 않았다. 입력받을 케이스 개수가 남았어도 케이스 정답이 틀린 경우 break문을 통해 해당 loop를 탈출하게끔 설계하였는데, 무슨 이유에서인지 탈출하지 못하였다. 내부적으로 어떤 문제가 있음을 예상하였는데, 우선 파이썬에 대하여 그정도까지 이해를 하고 있지 않으므로 로직을 엎고 다르게 짜야겠다고 생각했다.
두 번째 시도:
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
sample = list()
system = list()
# sample case
for i in range(n):
a, b = input().split()
sample.append(int(a==b))
for j in range(m):
c, d = input().split()
system.append(int(c==d))
if 0 in sample:
print("Wrong Answer")
elif 0 in system:
print("Why Wrong!!!")
else:
print("Accepted")
입력받는 것을 보니 숫자 범위만 좀 크고, 입력받는 케이스의 개수가 100 이하인 것을 확인할 수 있었다. 그래서 리스트를 부담없이 사용할 수 있을 것이라 생각했다.(이는 학습의 단계에 있어서 올바르지 못한 판단일 수 있습니다. 만약 너무 안일하게 생각한 것이라면 누구라도 지적해주시면 감사하겠습니다.) 따라서 샘플케이스와 시스템 케이스의 정답 여부를 리스트에 전부 담아주고, 입력을 마친 뒤에 리스트 내에 틀린 답(0)이 있는 경우에는 특정 문구를 출력하게끔 설계하였다.
여기서 50점(정답)을 받을 수 있었다.
기타 사항:
지난번에 기록한 문제에서는 python3으로는 시간 초과, pypy3로는 정답이었던 문제도 존재하였다. 이번 문제가 재밌는 것은, 혹시나 하고 pypy3로도 제출해봤는데 pypy3가 python3에 비해 훨씬 컴파일 시간도 오래 걸리고 메모리도 크게 잡아먹는 것을 확인할 수 있었다. pypy3가 python3과 컴파일 과정이 달라서 보통 python3보다 컴파일 시간이 빨라서 사용한다고 알고 있었는데, 내가 아는 깊이가 얉았다보니 일반화해서 생각했던 것으로 보인다. 물론 pypy3로 하면 일반적으로 정답에는 지장 없게 통과과 되는 것으로 체감상 느끼고 있지만, 둘의 차이를 좀 더 명확하게 파악하고 적절하게 혼용해서 사용할 수 있게 해야겠다.
'workspace > 알고리즘' 카테고리의 다른 글
[백준 / python] # 15652 N과 M(4) (0) | 2023.02.08 |
---|---|
[백준 / Python] #1718. 암호 (0) | 2023.02.07 |
[백준 / Python] #7795 먹을 것인가 먹힐 것인가 (0) | 2023.02.02 |
[백준 / python] #11652 카드 (1) | 2023.02.02 |
[백준 / Python] #3985 롤 케이크 (1) | 2023.02.02 |