Processing math: 100%

프로그래밍 115

[알고리즘] 알고리즘 문제를 풀 때 알면 좋은것들

알고리즘을 풀며 쌓아온 꿀팁 아닌 꿀팁을 정리하고자 한다. 1. (파이썬) 여러개의 변수 입력받기 # 여러개의 변수 a,b,c = map(int, input().split()) # 1 2 3 # 한줄로 입력받는 리스트 arr = list(map(int, input().split())) # 1 2 3 4 5 6 7 8 9 # 여러줄을 입력받는 리스트 arr = [int(input()) for _ in range(n)] # 1 # 2 # 3 # 4 # 2차원 배열 arr = [list(map(int, input().split())) for _ in range(n)] # 1 2 3 # 4 5 6 # 7 8 9 2. (파이썬) 배열 초기화 # 1차원 배열 a = [0]*n # 2차원 배열 a = [[0]*n f..

[알고리즘] 모듈러 연산과 페르마의 소정리

알고리즘 문제를 풀다 보면 "답이 커질 수 있으니 1,000,000,007로 나눈 나머지를 출력하시오" 이런 문장이 많이 보인다. 오늘은 이런 나머지연산에 대한 이야기를 하고자 한다. 피보나치 수 7 15624번: 피보나치 수 7 첫째 줄에 n번째 피보나치 수를 1,000,000,007으로 나눈 나머지를 출력한다. www.acmicpc.net 이 문제를 한번 보자 단순히 문제에서 제시한대로 구현한다면 이런 코드가 나올것이다. n = int(input()) a, b = 0, 1 for i in range(n): a,b = b, a+b print(a%1000000007) 하지만 이렇게 제출하게 되면 시간초과 또는 틀렸습니다를 받는다. 그 이유는 계산 과정에서 a, b의 값이 매우 커지기 때문이다. 이를 ..

[알고리즘] 피보나치 수열의 성질

피보나치 수는 많은 성질을 가지고 있다. 이 포스트에서 소개하고자 한다. 여기서 살펴볼 피보나치수열은 다음과 같다. F1=1,F2=1,Fn=Fn1+Fn2 (n3) 1. nk=1Fk=Fn+21 정의에 따라 F1=F3F2 F2=F4F3 ... Fn=Fn+2Fn+1 이다. 그럼 식을 다음과 같이 변형할 수 있다. F1+F2+...+Fn =(F3F2)+(F4F3)+...+(Fn+2Fn+1) =Fn+2F2 =Fn+21 이를 통해 bk=aFk $= \sum_{k=1}^b F_k..

[알고리즘] 분할 정복을 이용한 거듭제곱

이전 글에서 피보나치 수를 구하다가 빠른 거듭제곱이 나와 따로 글로 남기게 되었다. 거듭제곱을 위해 다음 코드를 작성하면 O(N)의 시간이 필요하다. def pow(a,n): r = 1 for _ in range(n): r *= a return r 위 코드는 거듭제곱을 an=an1×a 방식으로 구한다. 이것을 빠르게 해 보자! n이 짝수이면 an=an/2×an/2 n이 홀수이면 an=an/2×an/2×a 가 된다. 이제 이것을 재귀적으로 계산하면 된다. 예를 들어 360을 계산해보자 360=330×330 $3^{30} = 3^{15} \times 3..