728x90
반응형

문제:

어떤 자연수 N이 있을 때, 그 자연수  N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다.
어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 된다. 따라서 245는 256의 생성자가 된다. 물론, 어떤 자연수의 경우에는 생성자가 없을 수도 있다. 반대로, 생성자가 여러 개인 자연수도 있을 수 있다.

자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그램을 작성하시오.

입력:

첫째 줄에 자연수 N(1<=N<=1,000,000)이 주어진다.

출력:

첫째 줄에 답을 출력한다. 생성자가 없는 경우에는 0을 출력한다.

풀이 방법:

브루트 포스로 풀어야 하는 문제이므로 count를 하나씩 증가시켜가며 분해합을 찾도록 한다. 생성자가 없는 경우 count가 answer보다 커지게 되므로 이 경우를 체크해줘야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
answer=int(input())
 
count=1
while(True):
    temp=count
    for i in str(count): 
        temp+=int(i)
    if temp==answer:
        break
    elif count>answer:
        count=0
        break
    else:
        count+=1
print(count)
cs


728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[BOJ]2293. 동전1  (0) 2019.05.20
[BOJ]7568. 덩치  (0) 2019.05.19
[BOJ]2309. 일곱 난쟁이  (0) 2019.05.17
[BOJ]1015. 수열 정렬  (0) 2019.05.16
[BOJ]1547. 공  (0) 2019.05.15
728x90
반응형

문제:

왕비를 피해 일곱 난쟁이들과 함께 평화롭게 생활하고 있던 백설공주에게 위기가 찾아왔다. 일과를 마치고 돌아온 난쟁이가 일곱 명이 아닌 아홉 명이었던 것이다. 

아홉 명의 난쟁이는 모두 자신이 "백설 공주와 일곱 난쟁이"의 주인공이라고 주장했다. 뛰어난 수학적 직관력을 가지고 있던 백설공주는, 다행스럽게도 일곱 난쟁이의 키의 합이 100이 됨을 기억해 냈다.

아홉 난쟁이의 키가 주어졌을 때, 백설공주를 도와 일곱 난쟁이를 찾는 프로그램을 작성하시오.

입력:

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지 인 경우에는 아무거나 출력한다.

출력:

일곱 난쟁이의 키를 오름차순으로 출력한다. 일곱 난쟁이를 찾을 수 없는 경우는 없다.

풀이 방법:

브루트 포스 문제이므로 모든 나올 수 있는 경우의 수에 대해서 계산해주면 된다. 사실 경우의 수도 많은 편이 아니다.(9C7=9C2=36개)
파이썬에서 순열과 조합을 계산해줄 수 있도록 하는 모듈은 itertools를 사용했고, 그 중 combinations를 사용해서 9개 중 7개를 선택했다.
이 경우의 수 중 100이 되는 경우를 출력해주도록 한다.(답이 여러개라도 하나만 출력해도 괜찮으므로)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import itertools
 
Dwarfs=[]
for i in range(9):
    Dwarfs.append(int(input()))
Dwarfs.sort()
answers=list(itertools.combinations(Dwarfs,7))
for answer in answers:
    summation=0
    for i in answer:
        summation+=i
    if summation==100:
        temp=answer
        break
for i in temp:
    print(i)
cs


728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[BOJ]7568. 덩치  (0) 2019.05.19
[BOJ]2231. 분해합  (0) 2019.05.18
[BOJ]1015. 수열 정렬  (0) 2019.05.16
[BOJ]1547. 공  (0) 2019.05.15
[BOJ]10253. 헨리  (0) 2019.05.14
728x90
반응형

문제:

P[0], P[1], ....,P[N-1]은 0부터 N-1까지(포함)의 수를 한 번씩 포함하고 있는 수열이다. 수열 P의 길이가 N인 배열 A에 적용하면 길이가 N인 배열 B가 된다. 적용하는 방법은 B[P[i]]=A[i]이다. 

배열 A가 주어졌을 때, 수열 P를 적용한 결과가 비내림차순이 되는 수열을 찾는 프로그램을 작성하시오. 비내림차순이란, 각각의 원소가 바로 앞에 있는 원소보다 크거나 같을 경우를 말한다. 만약 그러한 수열이 여러개라면 사전순으로 앞서는 것을 출력한다.

입력:

첫째 줄에 배열 A의 크기 N이 주어진다. 둘째 줄에는 배열 A의 원소가 0번부터 차례대로 주어진다. N은 50보다 작거나 같은 자연수이고, 배열의 원소는 1,000보다 작거나 같은 자연수이다.

출력:

첫째 줄에 비내림차순으로 만드는 수열 P를 출력한다.

풀이 방법:

배열 A를 입력으로 받은 뒤에 이를 복사한 B 배열을 만든다. B 배열을 정렬하고 나서 각각 A의 배열의 원소에 대해 B에서 인덱스를 찾으면 된다.
하지만 이 중에 유의할 점은 배열 A의 원소에 공통의 값이 들어 있을 수 있다. 따라서 이를 해결해주기 위해서 count라는 변수를 만들어 주었다. 이 count는 공동 순위를 제어해 주는 변수이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
g=int(input())
a=list(map(int,input().split()))
b=a.copy()
b.sort()
answer=[]
for i in a:
    count=0
    while(1):
        if b.index(i)+count in answer:
            count+=1
        else:
            break
    answer.append(b.index(i)+count)
print(*answer)
cs


728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[BOJ]2231. 분해합  (0) 2019.05.18
[BOJ]2309. 일곱 난쟁이  (0) 2019.05.17
[BOJ]1547. 공  (0) 2019.05.15
[BOJ]10253. 헨리  (0) 2019.05.14
[BOJ]3036. 링  (0) 2019.05.13
728x90
반응형

문제:

세준이는 컵 3개를 탁자 위에 일렬로 놓았다. 컵의 번호는 가장 왼쪽 컵부터 순서대로 1번, 2번, 3번 이고, 세준이는 이 컵을 이용해서 게임을 하려고 한다.

먼저 1번컵의 아래에 공을 하나 넣는다. 세준이는 두 컵을 고른 다음, 그 위치를 바꾸려고 한다. 예를 들어, 고른 컵이 1번과 2번이라면, 1번 컵이 있던 위치에 2번 컵을 이동시키고, 동시에 2번 컵이 있던 위치에 1번 컵을 이동시켜야 한다. 위치를 바꿀 때, 컵을 먼저 들고 이동해야 한다. 따라서, 공의 위치는 가장 처음 1번컵이 있던 위치와 같다.

세준이는 컵의 위치를 총 M번 바꿀 것이며, 컵의 위치를 바꾼 방법이 입력으로 주어진다. 위치를 M번 바꾼 이후에 공이 들어있는 컵의 번호를 구하는 프로그램을 작성하시오.

입력:

첫째 줄에 컵의 위치를 바꾼 횟수 M이 주어지며, M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에는 컵의 위치를 바꾼 방법 X와 Y가 주어지며, X번 컵과 Y번 컵의 위치를 서로 바꾸는 것을 의미한다.

컵을 이동시키는 중에 공이 컵에서 빠져나오는 경우는 없다. X와 Y의 값은 3보다 작거나 같고, X와 Y가 같을 수도 있다.

출력:

첫째 줄에 공이 들어있는 컵의 번호를 출력한다. 공이 사라져서 컵 밑에 없는 경우에는 -1을 출력한다.

풀이 방법:

모든 컵의 이동을 기억할 필요없이 공이 들어 있는 컵의 번호만 기억해주면 된다. 처음 공의 위치를 항상 1이며 이후 컵의 위치를 바꾼 방법 중 공의 위치의 번호가 있다면 이를 바꿔 주기만 하면 된다.

1
2
3
4
5
6
7
8
answer=1
for i in range(int(input())):
    a,b=map(int,input().split())
    if answer==a:
        answer=b
    elif answer==b:
        answer=a
print(answer)
cs


728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[BOJ]2309. 일곱 난쟁이  (0) 2019.05.17
[BOJ]1015. 수열 정렬  (0) 2019.05.16
[BOJ]10253. 헨리  (0) 2019.05.14
[BOJ]3036. 링  (0) 2019.05.13
[BOJ]2591. 이항 쇼다운  (0) 2019.05.12
728x90
반응형

문제:

이제 10 살이 된 헨리(Henry)는 수학에 소질이 있다. 수학선생님인 아메스(Ahmes)는 오늘 헨리에게 분수에 대해 가르쳐줬고, 헨리는 분수를 이리저리 계산해보는 것이 너무 재미있었다. 그러던 중에 헨리는 1 보다 작은 분수를 여러 개의 서로 다른 단위분수의 합으로 표현할 수 있다는 것을 알아내었다. 여기서 단위분수란 분자가 1 인 분수를 말한다. 헨리는 여러 개의 분수에 대해 이를 시도해봤고, 시도해본 분수들은 모두 서로 다른 단위분수의 합으로 표현할 수 있었다. 예를 들어, 423 16+1138와 같이 두 개의 단위 분수의 합으로 나타낼 수 있다. 

헨리는 이런 발견을 선생님인 아메스에게 자랑스럽게 이야기했다. 아메스는 이를 듣고는 크게 기뻐하며 어린 제자를 칭찬했고, 이와 같이 하나의 분수를 서로 다른 단위분수의 합으로 표현한 것을 헨리식 표현법(Henry representation)이라고 이름 지었다. 즉, 분수 ab의 헨리식 표현법은 총합이 ab 와 같게 되는 서로 다른 단위분수의 나열이다. 헨리와 아메스는 헨리식 표현법에 대하여 더욱 연구하였고, 마침내 모든 1 보다 작은 분수는 헨리식 표현법이 가능함을 증명하였다. 또한 헨리식 표현법이 유일하지 않다는 것도 알 수 있었다. 예를 들면, 57=12+15+170=12+16+121=12+17+114 와 같이 여러 가지 다른 헨리식 표현법이 존재할 수 있다. 단, 정의에 의해, 헨리식 표현법에는 같은 단위분수가 두 개 이상 포함될 수 없으므로 23=13+13 는 헨리식 표현법이 아님을 유념해야 한다.

아메스와 헨리는 또한 주어진 분수의 헨리식 표현법을 구하는 간단한 방법도 고안해냈다. a<b인 양의 정수 a b로 이루어진 분수 ab가 주어질 때에, 먼저 1x1ab를 만족하는 가장 큰 단위 분수 1x1를 계산한다. 그런 다음 ab 에서 1x1를 뺀 나머지에 대하여 위의 과정을 반복한다. 즉, 1x2ab1x1를 만족하는 가장 큰 단위분수 1x2를 계산하고 뺀다. 이러한 과정을 나머지가 남지 않을 때까지 반복한다. 그러면 서로 다른 단위분수들 1x1,1x2,1x3,을 순서대로 얻게 되며 그들의 합은 정확히 ab와 같아진다. 아메스와 헨리는 이 알고리즘이 항상 종료하며 합이 ab가 되는 서로 다른 단위분수들, 즉 헨리식 표현법을 출력함을 증명하였다.

아메스와 헨리는 당신에게 그들의 알고리즘을 컴퓨터 프로그램으로 구현해줄 것을 부탁했다. 입력으로 주어지는 1 보다 작은 분수 ab 를 아메스와 헨리의 알고리즘을 수행하여 헨리식 표현법을 계산할 때에 마지막 단위 분수의 분모를 출력하는 프로그램을 작성하시오. 예를 들어. ab=57라면, 아메스와 헨리의 알고리즘은 57=12+15+170 을 출력하게 되므로 당신의 프로그램은 반드시 70 을 출력해야 한다.

입력:

입력 데이터는 표준입력을 사용한다. 입력은 T 개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 테스트 데이터의 개수 T 가 정수로 주어진다. 각 테스트 데이터는 한 줄로 구성되며, 여기에는 입력 분수 
ab를 의미하는 두 개의 정수 a b (1 ≤ a < b ≤ 10,000) 가 주어진다. 이때, a b는 서로소이며, 입력분수 ab 에 대해 아메스와 헨리의 알고리즘을 실행했을 때에 출력되는 단위 분수가 순서대로 1x1,1x2,1x3,,1xm 라면, bx1x2xm1<231 의 부등식을 만족한다고 가정할 수 있다.

출력:

출력은 표준출력을 사용한다. 각 테스트 데이터에 대해, 정확히 한 줄을 출력해야 하며 여기에는 정수 하나만을 출력한다. 이 정수는 아메스와 헨리의 알고리즘을 입력 분수 ab 에 대해 실행했을 때, 출력되는 헨리식 표현법의 마지막 단위분수의 분모와 같아야 한다.

풀이 방법:

가장 큰 1/x를 구하기 위해서는 원래 분수에서 분자를 1로 만들었을 때에 생기는 분모의 값을 올림해주면 된다. (분수의 경우에 분모가 작을수록 크다.)
따라서 (a/b-1/x1-1/x2- .... )의 분자가 1이 될 때까지 while로 반복하도록 한다. 또한 새 분수를 만들고 나서 약분하는 작업이 필요하므로 분수 계산을 도와주는 모듈인 fraction을 사용하도록 한다.


1
2
3
4
5
6
7
8
9
from fractions import Fraction
for i in range(int(input())):
    a,b=map(int,input().split())
    while(a!=1):
        c=b//a+1
        a=a*c-b
        b=b*c
        a,b=map(int,str(Fraction(a,b)).split('/'))
    print(b)
cs


728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[BOJ]1015. 수열 정렬  (0) 2019.05.16
[BOJ]1547. 공  (0) 2019.05.15
[BOJ]3036. 링  (0) 2019.05.13
[BOJ]2591. 이항 쇼다운  (0) 2019.05.12
[BOJ]2407. 조합  (0) 2019.05.11
728x90
반응형

문제:

상근이는 창고에서 링 N개를 발견했다. 상근이는 각각의 링이 앞에 있는 링과 뒤에 있는 링과 접하도록 바닥에 내려놓았다. 

상근이는 첫 번째 링을 돌리기 시작했고, 나머지 링도 같이 돌아간다는 사실을 발견했다. 나머지 링은 첫 번째 링보다 빠르게 돌아가기도 했고, 느리게 돌아가기도 했다. 이렇게 링을 돌리다 보니 첫 번째 링을 한 바퀴 돌리면, 나머지 링은 몇 바퀴 도는지 궁금해졌다.

링의 반지름이 주어진다. 이때, 첫 번째 링을 한 바퀴 돌리면, 나머지 링은 몇 바퀴 돌아가는지 구하는 프로그램을 작성하시오,

입력:

첫째 줄에 링의 개수 N이 주어진다. (3<=N<=100)

다음 줄에는 링의 반지름이 상근이가 바닥에 놓은 순서대로 주어진다. 반지름은 1과 1000을 포함하는 사이의 자연수이다.

출력:

출력은 총 N-1 줄을 해야 한다. 첫 번째 링을 제외한 각각의 링에 대해서, 첫 번째 링을 한 바퀴 돌리면 그 링은 몇 바퀴 도는지 기약 분수 형태 A/B로 출력한다.

풀이 방법:

 모든 링은 첫 번째 링의 크기에 따라서 돌아가는 횟수가 정해지게 된다. 예제의 경우로 보면 첫 번째 링이 12이므로 두 번째 링은 12/3 인 4이고, 세 번째 링은 12/8=3/2, 마지막 링은 12/4 이므로 3이 되게 된다. 

python에서는 이러한 분수 약분 및 계산을 해주는 fraction이라는 모듈이 있다. 따라서 첫 번째 링을 기준으로 나머지 링에 대해 분수형태로 만들면 된다. 하지만 정수인 경우에도 분수 형태로 만들어 줘야 하는 작업이 필요하므로, 따로 분류해서 만들어주도록 한다.

1
2
3
4
5
6
7
8
9
from fractions import Fraction
a=int(input())
number=list(map(int,input().split()))
for i in range(1,len(number)):
    result=Fraction(number[0],number[i])
    if int(result)==result:
        print(str(result)+"/"+"1")
    else:
        print(str(result))
cs


728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[BOJ]1547. 공  (0) 2019.05.15
[BOJ]10253. 헨리  (0) 2019.05.14
[BOJ]2591. 이항 쇼다운  (0) 2019.05.12
[BOJ]2407. 조합  (0) 2019.05.11
[BOJ]1676. 팩토리얼 0의 개수  (0) 2019.05.10
728x90
반응형

문제:

n개의 원소 중에서 k개를 순서 없이 선택하는 방법의 수는 몇 가지 일까?

입력:

입력은 하나 또는 그 이상의 테스트 케이스로 이루어져 있다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 2^31 -1 을 넘지 않는 두 자연수 n (n>=1) 과 k(0<=k<=n)로 이루어져 있다.

입력의 마지막 줄에는 0이 두 개 주어진다.

출력:

각 테스트 케이스에 대해서, 정답을 출력한다. 항상 정답이 2^31보다 작은 경우만 입력으로 주어진다.

풀이 방법:

일반적으로 nCk 를 구하는 문제와 동일하긴 하지만 n과 k의 크기가 많이 크므로 이를 정제하는 작업이 필요하다. 이전 문제에서 nCk를 구할 때 n!/k!*(n-k)!을 통해서 값을 얻는다고 하지만 실제로 사람이 계산할 때는 그렇게 하지 않는다. 10C4가 있다면 10!/4!6!을 통해서 계산을 해야겠지만 사람이라면 약분을 해서 10*9*8*7/4! 으로 구하게 된다. 따라서 이 문제도 약분을 통해서 간략화해야 한다. 또한 nCk=nCn-k와 동일하다는 공식도 존재하므로 k가 일정 값을 넘어가면 이를 통해서 k의 크기를 줄이도록 했다.

1
2
3
4
5
6
7
8
9
10
11
12
while(True):
    m,n=map(int,input().split())
    if m==0 and n==0:
        break
    if m-n<n:
        n=m-n
    answer=1
    for i in range(1,n+1):
        answer*=m
        m-=1
        answer/=i
    print(int(answer))
cs


728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[BOJ]10253. 헨리  (0) 2019.05.14
[BOJ]3036. 링  (0) 2019.05.13
[BOJ]2407. 조합  (0) 2019.05.11
[BOJ]1676. 팩토리얼 0의 개수  (0) 2019.05.10
[BOJ]11051. 이항 계수 2  (0) 2019.05.09
728x90
반응형

문제:

nCm 을 출력한다.

입력:

n과 m이 주어진다. (5<=n<=100,5<=m<100, m<=n)

출력:

nCm을 출력한다.

풀이 방법:

수학 공식으로 (n k)는 n!/k!(n-k)!과 같다. 따라서 math 모듈에 있는 factorial 함수를 이용해서 계산 하였다.

1
2
3
import math
n,m=map(int,input().split())
print(math.factorial(n)//(math.factorial(m)*math.factorial(n-m)))
cs


728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[BOJ]3036. 링  (0) 2019.05.13
[BOJ]2591. 이항 쇼다운  (0) 2019.05.12
[BOJ]1676. 팩토리얼 0의 개수  (0) 2019.05.10
[BOJ]11051. 이항 계수 2  (0) 2019.05.09
[BOJ]11050. 이항 계수 1  (0) 2019.05.08
728x90
반응형

문제:

N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오.

입력:

첫째 줄에 N이 주어진다. (0<=N<=500)

출력:

첫째 줄에 구한 0의 개수를 출력한다.

풀이 방법:

뒷자리에 0이 생기기 위해서는 10을 곱해야 한다. 따라서 N! 중에서 0이 생기는 경우는 크게 두가지가 있다.

1. 10을 곱하는 경우
2. 5의 배수를 곱하는 경우

1번의 경우에는 0이 생기는 것이 자명하므로 설명을 생략한다. 2번의 경우에는 5의 배수의 값과 짝수를 곱하면 10이 생기게 된다. (2 x 5= 10)
즉 이 두경우를 합쳐서 1<=i <=N 인 i에 대해서 5로 나누어떨어질 경우 count를 1 더해주면 된다. 하지만 이 중에는 25와 같이 5의 배수가 두개인 경우도 있으므로 while문을 사용하도록 한다.

1
2
3
4
5
6
7
8
9
10
a=int(input())
answer=0
for i in range(1,a+1):
    while True:
        if i%5==0:
            answer+=1
            i/=5
        else:
            break
print(answer)
cs



728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[BOJ]2591. 이항 쇼다운  (0) 2019.05.12
[BOJ]2407. 조합  (0) 2019.05.11
[BOJ]11051. 이항 계수 2  (0) 2019.05.09
[BOJ]11050. 이항 계수 1  (0) 2019.05.08
[BOJ]11866. 조세퍼스 문제0  (0) 2019.05.07
728x90
반응형

문제:

자연수 N과 정수 K가 주어졌을 때 이항 계수 (N, K)를 10,007로 나눈 나머지를 구하는 프로그램을 작성하시오.

입력:

첫째 줄에 N과 K가 주어진다. (1<=N<=1,000, 0<=K<=N)

출력:

(N, K)를 10,007로 나눈 나머지를 출력한다.

풀이 방법:

N의 크기가 커짐에 따라서 더 이상 이항계수 문제를 재귀적방법으로 해결할 수 없다. 일반적으로 재귀함수가 가독성이 좋긴 하지만 동일한 함수를 자주 호출하다보니 N이 커질수록 stack overflow가 발생할 수 있다. 따라서 이를 해결하는 방법으로 dp (메모리제이션) 을 사용한다. 작은 값의 함수들 부터 배열에 값을 저장하면서 원하는 값까지 진행을 하는 방식이다. 
따라서 이항계수1 문제와 풀이는 비슷하나 함수를 호출하는 것이 아닌 배열의 값을 호출한다는 차이가 있다.

1
2
3
4
5
6
7
8
9
10
11
a,b=map(int,input().split())
def bin2(n,k):
    b=[[0 for i in range(k+1)] for j in range(n+1)]
    for i in range(1,n+1):
        for j in range(min(n,k)+1):
            if (j==0 or j==i):
                b[i][j]=1
            else:
                b[i][j]=b[i-1][j-1]+b[i-1][j]
    return b[n][k]%10007
print(bin2(a,b))
cs


728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[BOJ]2407. 조합  (0) 2019.05.11
[BOJ]1676. 팩토리얼 0의 개수  (0) 2019.05.10
[BOJ]11050. 이항 계수 1  (0) 2019.05.08
[BOJ]11866. 조세퍼스 문제0  (0) 2019.05.07
[Programmers]Lv 3.디스크 컨트롤러  (2) 2019.05.06

+ Recent posts