SWEA

[D3] SWEA 17937. 큰 수의 최대공약수

코테봇 2024. 4. 27. 22:37

D3 문제 중 유일하게 풀지 못했다.

1<=A<=B<=10100의 조건을 보고

정석적으로 접근했었다.

1부터 A의 약수를 구한 뒤

A+1~B까지 A의 약수 리스트에 있는 수로 나눠지는 수 중

가장 큰 수 이런 식으로 구할려했다.

1. 접근 방식

문제의 조건 중 10100=10^100이었다.

시간복잡도가 어마어마할 것이다.

정석적으로 접근하면 안된다는 사실을 알 수 있다.

 

이 사실을 알 수 있다.

자신이랑 1 차이가 나는 숫자와의 최대공약수는 항상 1이다.

ex) gcd(2,3)=1, gcd(3,4)=1, gcd(55,56)=1, gcd(24,25)=1 , ~~~

->이렇게 자신이랑 1 차이가 나는 숫자와의 최대공약수가 항상 1이면

    뒤를 따지는 것은 의미가 없다.

 

2. 디테일한 구현

1) a==b

최대공약수 a(b)

 

2)a<b

최대공약수 1

 

 

3. 코드 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if __name__=='__main__':
    sys.stdin=open('input2.txt','r')   
    
    
    t=int(input()) ## 총 테스트 케이스 개수
    
    for tc in range(t):
       a,b=map(int,input().split())
       
       if a==b:
           print(f'#{tc+1} {a}')
       elif a<b:
           print(f'#{tc+1} {1}')
    
cs

 

 

 

4. 깨달은 점 및 반성

문제 풀이 실패 이유는 2가지가 있다.

1)나는 인접한 두 수 사이의 최대공약수는 항상 1이다.라는

사실이 수학적으로 증명이 돼?

이렇게 빡빡하게 생각하는 버릇이 있어서다.

하지만 D3이고 그렇게 빡빡한 생각을 요구하지는 않는 것 같다.

좀 더 널널하게, 편하게 생각하자.

2)조건이 작은 것부터 큰 것까지 나열하게 생각하지 않았다.

->수열의 길이가 1,2,3,~~n개 이런 식으로 확장하는 버릇을 들여야한다.

->추상적으로 생각하는 버릇이 있다.