BeakJoon/Python

[Python] 백준 #1402번 : 아무래도이문제는A번난이도인것같다

쿼딩~ 2023. 10. 24. 01:33


걸림돌

  • 문제에서 제시하는 A,B의 관계를 검출 해내는 코드를 짜는데 어려움을 겪음
    • A의 약수를 구하는 코드를 만들고 각 약수를 더해서 B가 나오게 만드는 코드를 처음에 만듬 but 정답은 그게 아니었음 아래서 설명
  • 코드를 다 짜고 제출하는데 채점 결과에 시간 초과가 뜸
    • input()을 sys.stdin.readline()으로 바꿔서 제출 했는데도 또 시간 초과가 떠서 이런 경우는 처음이라 당화하였으나 답 자체가 틀린거였음

코드


import sys
N = int(sys.stdin.readline())

# N 번 반복하는 for문
for _ in range (N):
    num, num2= map(int,sys.stdin.readline().split())

    list = []

    # 1 부터 num+1 까지 i에 대입하면서 반복하는 for문
    for i in range (1, num+1):
        # num을 1부터 num+1 까지로 나눈 나머지가 0이라면 약수이기 때문에 list에 저장
        if num % i == 0:
            list.append(i)

    # 약수로 만들지 못하는 수면 'no'를 출력해야하기 때문에 result 값을 'no'로 저장
    result = 'no'
    # 약수의 수 보다 1 작은 수 만큼 반복하는 for문
    for i in range (len(list)-1):
        # list의 각 인덱스를 0부터 1씩 증가시켜서 더하고
        # num2 값과 같으면 'yes'를 result 값에 저장하고 반복문 탈출
        if list[i]+list[i+1] == num2:
            result = 'yes'
            break

    print (result)

이 코드는 처음에 실패한 코드에서 input()을 sys.stdin.readline()으로 바꾼 코드이다.

이렇게 했는데도 시간 초과가 떴다.


올바른 코드

for _ in range(int(input())):
    A, B = map(int, input().split())
    print("yes")

이 문제는 단순한 수학 문제였다.

A = 1*1*...1*A 또는 A = -1*-1*...-1*A 같은 식으로도 조건을 만족하기 때문에 A'는 어떤 A''든 만들 수 있다.

A가 -1이거나 1이면 안된다는 조건이 없었기 때문에 A는 어떤 A든 만들 수 있는 것.

위의 코드로 해결했다.


알게된 것

  • 알고리즘 문제 중 코드 짜는 것이 중요한 것이 아닌 이렇게 수학적 사고가 필요한 문제도 존재한다는 것
  • 다음부턴 문제의 조건도 잘 생각해야겠다는 것