Coding Test/Math
[2004] 조합 0의 개수
2004번: 조합 0의 개수 첫째 줄에 정수 $n$, $m$ ($0 \le m \le n \le 2,000,000,000$, $n \ne 0$)이 들어온다. www.acmicpc.net 분석 조합 = nCm = n!/(m!*(n-m)!) 조합을 구해서 답을 내는 것이 아닌 조합 내의 0의 개수를 구하는 문제 끝자리가 0이라는 것은 10의 배수 10의 개수 = 2의 개수와 5의 개수 중 작은 것의 개수 (2와 5가 짝을 이뤄 10이되기 때문) n!가 가지고 있는 2의 개수 - m!이 가지고 있는 2의 개수 - (n-m)!이 가지고 있는 2의 개수 n!가 가지고 있는 5의 개수 - m!이 가지고 있는 5의 개수 - (n-m)!이 가지고 있는 5의 개수 중에 작은 수 풀이 """ n,m
[1057] 토너먼트
1057번: 토너먼트 김지민은 N명이 참가하는 스타 토너먼트에 진출했다. 토너먼트는 다음과 같이 진행된다. 일단 N명의 참가자는 번호가 1번부터 N번까지 배정받는다. 그러고 난 후에 서로 인접한 번호끼리 스타를 www.acmicpc.net 풀이 """ N명의 참가자는 번호가 1번부터 N번까지 배정받는다. 그러고 난 후에 서로 인접한 번호끼리 스타를 한다. 만약 그 라운드의 참가자가 홀수명이라면, 마지막 번호를 가진 참가자는 다음 라운드로 자동 진출한다. 번호를 다시 배정받은 후에 한 명만 남을 때까지 라운드를 계속 한다. 일단 김지민과 임한수는 서로 대결하기 전까지 항상 이긴다고 가정한다. 1라운드에서 김지민의 번호와 임한수의 번호가 주어질 때, 과연 김지민과 임한수가 몇 라운드에서 대결하는지 출력 만약..
[1038] 감소하는 수 (백트래킹, 조합, 재귀)
1038번: 감소하는 수 음이 아닌 정수 X의 자릿수가 가장 큰 자릿수부터 작은 자릿수까지 감소한다면, 그 수를 감소하는 수라고 한다. 예를 들어, 321과 950은 감소하는 수지만, 322와 958은 아니다. N번째 감소하는 수를 www.acmicpc.net 분석 숫자를 덧붙이는 방법으로 한자리, 두자리, 세자리,... 의 감소하는 수 리스트 생성 재귀 n = int(input()) nums = [] def add(idx, num): # 자리수에 따라 증가 if idx == 1: nums.append(num) else: for i in range(num % 10): # 앞자리보다 작은 숫자들만 이어붙이기 add(idx-1, num*10 + i) for i in range(1, 11): for j in ..
[1476] 날짜계산 (백트래킹)
1476번: 날짜 계산 준규가 사는 나라는 우리가 사용하는 연도와 다른 방식을 이용한다. 준규가 사는 나라에서는 수 3개를 이용해서 연도를 나타낸다. 각각의 수는 지구, 태양, 그리고 달을 나타낸다. 지구를 나타 www.acmicpc.net 풀이 """ 지구를 나타내는 수를 E, 태양을 나타내는 수를 S, 달을 나타내는 수를 M이라고 했을 때, 이 세 수는 서로 다른 범위를 가진다. (1 ≤ E ≤ 15, 1 ≤ S ≤ 28, 1 ≤ M ≤ 19) 우리가 알고있는 1년은 준규가 살고있는 나라에서는 1 1 1로 나타낼 수 있다. 1년이 지날 때마다, 세 수는 모두 1씩 증가한다. 만약, 어떤 수가 범위를 넘어가는 경우에는 1이 된다. 1년이 준규가 사는 나라에서 1 1 1일때, 준규가 사는 나라에서 E S..
[1676] 팩토리얼 0의 개수
1676번: 팩토리얼 0의 개수 N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오. www.acmicpc.net 풀이 """" N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오. 첫째 줄에 N이 주어진다. (0 ≤ N ≤ 500) """ import math n=int(input()) def fac(x): if x>1: return x * fac(x - 1) else: return 1 m=str(fac(n)) # m=str(math.factorial(n)) cnt=0 for i in range(len(m)): if m[-1-i]=='0': cnt+=1 else: break print(cnt)
[1193] 분수찾기
1193번: 분수찾기 첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다. www.acmicpc.net 분석 첫행 번호 나열 : 1,2,4,7,11,... 등차수열 ➔ 리스트 생성 지그재그 순서로 차례대로 1번, 2번, 3번, 4번, 5번, ... ➔ 짝수일 때와 홀수일 때로 구분 풀이 """ 분수들을 1/1 → 1/2 → 2/1 → 3/1 → 2/2 → … 과 같은 지그재그 순서로 차례대로 1번, 2번, 3번, 4번, 5번, … 분수라고 하자. 1/1 - 1/2 - 2/1 - 3/1 - 2/2 - 1/3 - 1/4 - 2/3 - 3/2 - 4/1 - 5/1 - 4/2 - 3/3 - 2/4 X가 주어졌을 때, X번째 분수를 구하는 프로그램을 작성하시오. 1 ≤ X ≤ 10,000,000 """ ..
[4948] 베르트랑 공준 (소수의 개수)
4948번: 베르트랑 공준 베르트랑 공준은 임의의 자연수 n에 대하여, n보다 크고, 2n보다 작거나 같은 소수는 적어도 하나 존재한다는 내용을 담고 있다. 이 명제는 조제프 베르트랑이 1845년에 추측했고, 파프누티 체비쇼 www.acmicpc.net 분석 자연수 n에 대하여, n보다 크고, 2n보다 작거나 같은 소수는 적어도 하나 존재한다 자기자신 포함하지 않음 [1929] 소수 구하기 (에라토스테네스 방식, 2부터 배수 제거) 1929번: 소수 구하기 첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다. www.acmicpc.net 분석 1 ≤ M ≤ N ≤ 1,000,000 karla.tis..
[9613] GCD 합 (조합)
9613번: GCD 합 첫째 줄에 테스트 케이스의 개수 t (1 ≤ t ≤ 100)이 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있다. 각 테스트 케이스는 수의 개수 n (1 < n ≤ 100)가 주어지고, 다음에는 n개의 수가 주어진 www.acmicpc.net 풀이 """ 양의 정수 n개가 주어졌을 때, 가능한 모든 쌍의 GCD의 합을 구하는 프로그램을 작성하시오. 첫째 줄에 테스트 케이스의 개수 t (1 ≤ t ≤ 100)이 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있다. 각 테스트 케이스는 수의 개수 n (1 < n ≤ 100)가 주어지고, 다음에는 n개의 수가 주어진다. 입력으로 주어지는 수는 1,000,000을 넘지 않는다. """ import sys input=sys.stdin...
[1011] Fly me to the Alpha Centauri
1011번: Fly me to the Alpha Centauri 우현이는 어린 시절, 지구 외의 다른 행성에서도 인류들이 살아갈 수 있는 미래가 오리라 믿었다. 그리고 그가 지구라는 세상에 발을 내려 놓은 지 23년이 지난 지금, 세계 최연소 ASNA 우주 비행 www.acmicpc.net 분석 이동해야 하는 거리 n의 제곱보다 작거나 같을 때 공간이동 작동 횟수 = n * 2 - 1 n의 제곱보다 클 때공간이동 작동 횟수 = n * 2 거리 경로 N N² 공간이동 작동횟수 반복횟수 1 1 1 1 1 1 2 11 1 1 2 1 3 111 2 4 3 2 4 121 2 4 3 5 1211 2 4 4 2 6 1221 2 4 4 7 12211 3 9 5 3 8 12221 3 9 5 9 12321 3 9 5 10..
[2960] 에라토스테네스의 체
2960번: 에라토스테네스의 체 2, 4, 6, 8, 10, 3, 9, 5, 7 순서대로 지워진다. 7번째 지워진 수는 9이다. www.acmicpc.net 풀이 """ N, K가 주어졌을 때, K번째 지우는 수를 구하는 프로그램을 작성하시오. """ n,k = map(int, input().split()) list = [0] * (n+1) for i in range(2, n+1): list[i]=i cnt=1 # 1 지움 ch=True for i in range(2, n+1): if ch: for j in range(i, n+1, i): if list[j]!=0: if cnt==k: print(j) ch=False break cnt += 1 list[j]=0