목록백준 (45)
STUDY_SEONMIN
어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 된다. 따라서 245는 256의 생성자가 된다. 물론, 어떤 자연수의 경우에는 생성자가 없을 수도 있다. 반대로, 생성자가 여러 개인 자연수도 있을 수 있다. 자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그램을 작성하시오. N = int(input()) ans = 0 for num in range(1,N): s = num n = str(num) for i in n: s += int(i) if s == N: ans = num break print(ans) 각 자리..
카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 블랙잭은 카지노마다 다양한 규정이 있다. 한국 최고의 블랙잭 고수 김정인은 새로운 블랙잭 규칙을 만들어 상근, 창영이와 게임하려고 한다. 김정인 버전의 블랙잭에서 각 카드에는 양의 정수가 쓰여 있다. 그 다음, 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓는다. 그런 후에 딜러는 숫자 M을 크게 외친다. 이제 플레이어는 제한된 시간 안에 N장의 카드 중에서 3장의 카드를 골라야 한다. 블랙잭 변형 게임이기 때문에, 플레이어가 고른 카드의 합은 M을 넘지 않으면서 M과 최대한 가깝게 만들어야 한다. N장의 카드에 써져 있는 숫자가 주어졌을 때, M을 ..
세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로 옮기려 한다. 한 번에 한 개의 원판만을 다른 탑으로 옮길 수 있다. 쌓아 놓은 원판은 항상 위의 것이 아래의 것보다 작아야 한다. 이 작업을 수행하는데 필요한 이동 순서를 출력하는 프로그램을 작성하라. 단, 이동 횟수는 최소가 되어야 한다. def hanoi(n, from_bar, to_bar, layover_bar): global move if n==1: move.append((from_bar,to_bar)) return hanoi(n-1, from_bar, layover_bar, to_bar) move.app..
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다. *** * * *** N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3k이며, 이때 1 ≤ k < 8이다. 첫째 줄부터 N번째 줄까지 별을 출력하는 프로그램을 작성하세요. def draw_star(N): if N == 3: return ['***', '* *', '***'] stars = [] for..
피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다. n=17일때 까지 피보나치 수를 써보면 다음과 같다. 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597 n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오. def fibo(n): if n == 0 or n == 1: return n return fibo(n-1) + fibo(n-2) N = int(input()) print(fibo(N)) 재귀함수를 이용해 피보나치 수열을 구현하였..
0보다 크거나 같은 정수 N이 주어진다. 이때, N!을 출력하는 프로그램을 작성하시오. def factorial(N): if N == 0: return 1 return N * factorial(N-1) N = int(input()) print(factorial(N)) 재귀함수는 함수 안에 자기자신을 또 호출하는 함수입니다. factorial(N)함수의 경우 재귀함수의 호출이 종료되는 지점인 0 까지의 계산이 다음과 같습니다. N * factorial(N-1) => N * N-1 * factorial(N-2) => ... => N * N-1 * N-2 * ... * 1 * factorial(0) => N * N-1 * N-2 * ... * 1 * 1
조규현의 좌표 (x1, y1)와 백승환의 좌표 (x2, y2)가 주어지고, 조규현이 계산한 류재명과의 거리 r1과 백승환이 계산한 류재명과의 거리 r2가 주어졌을 때, 류재명이 있을 수 있는 좌표의 수를 출력하는 프로그램을 작성하시오. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다. T = int(input()) for _ in range(T): x1, y1, r1, x2, y2, r2 = map(int,input().split()) d = ((x2-x1)**2 + (y2-y1)**2)**0.5 if d == 0 and r1 == r2: print(-1) else: if d > r1+r2 or d < abs(r2-r1): print(0) elif d == r1+r2 or d..
19세기 독일 수학자 헤르만 민코프스키는 비유클리드 기하학 중 택시 기하학을 고안했다. 택시 기하학에서 두 점 T1(x1,y1), T2(x2,y2) 사이의 거리는 다음과 같이 구할 수 있다. D(T1,T2) = |x1-x2| + |y1-y2| 두 점 사이의 거리를 제외한 나머지 정의는 유클리드 기하학에서의 정의와 같다. 따라서 택시 기하학에서 원의 정의는 유클리드 기하학에서 원의 정의와 같다. 원: 평면 상의 어떤 점에서 거리가 일정한 점들의 집합 반지름 R이 주어졌을 때, 유클리드 기하학에서 원의 넓이와, 택시 기하학에서 원의 넓이를 구하는 프로그램을 작성하시오. import math pi = math.pi R = int(input()) print('{:.6f}'.format(R**2*pi)) prin..
과거 이집트인들은 각 변들의 길이가 3, 4, 5인 삼각형이 직각 삼각형인것을 알아냈다. 주어진 세변의 길이로 삼각형이 직각인지 아닌지 구분하시오. while True: x, y, z = map(int,input().split()) if x+y+z == 0: break line = [x, y, z] line.sort() if line[0]**2+line[1]**2 == line[2]**2: print('right') else: print('wrong') 주어진 세변의 길이 중 가장 긴변의 길이의 제곱이 나머지 변의 제곱합과 동일하면 피타고라스 정리의 역에 의해서 직각삼각형이 됩니다. 이 원리를 이용해서 조건에 부합하면 'right' 그렇지 않으면 'wrong'을 출력하도록 프로그램을 구현했습니다.
세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오. x1, y1 = map(int, input().split()) x2, y2 = map(int, input().split()) x3, y3 = map(int, input().split()) x, y = [x1, x2, x3], [y1, y2, y3] for i in x: if x.count(i) == 1: x4 = i break for j in y: if y.count(j) == 1: y4 = j break print(x4, y4) 직사각형의 성질을 생각해보면 직사각형의 네 꼭지점의 좌표들은 (x1, y1), (x1, y2), (x2, y1), (x2,y2) 와 같은 형태를 지니게 됩니다. 이는 ..