문제풀이/백준(Boj) 문제풀이

문제풀이/백준(Boj) 단계별 풀이백준 - 단계별로 풀기 10단계 파이썬 - (재귀 단계 - 10872번, 10870번, 2447번, 11729번)

얄루몬 2021. 8. 1. 00:14

https://www.acmicpc.net/problem/10872

 

10872번: 팩토리얼

0보다 크거나 같은 정수 N이 주어진다. 이때, N!을 출력하는 프로그램을 작성하시오.

www.acmicpc.net

팩토리얼

시간 제한메모리 제한제출정답맞은 사람정답 비율

1 초 256 MB 76497 37394 31458 49.433%

문제

0보다 크거나 같은 정수 N이 주어진다. 이때, N!을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 정수 N(0 ≤ N ≤ 12)가 주어진다.

출력

첫째 줄에 N!을 출력한다.

예제 입력 1 복사

10

예제 출력 1 복사

3628800

예제 입력 2 복사

0

예제 출력 2 복사

1

출처

알고리즘 분류

 

- 0! = 1 .... 1! = 1

- 2! = (2*(2-1)

- n! = n*(n-1)*....*1

def factorial(n):
    if n <= 1:
        return 1
    else:
        return n*factorial(n-1)

n = int(input())
print(factorial(n))

- 계속해서 자기 자신을 뺀 것을 곱해준다. 이것을 재귀라고 표현한다.

- 재귀에 대해서 잘 모르시는 분들 https://yeomylaoo.tistory.com/67?category=893760 에서 살펴봐주세요! 

📌출처: https://www.google.com/url?sa=i&url=https%3A%2F%2Fcodepractice.tistory.com%2F92&psig=AOvVaw0Um2fLtBoaTmtQaDkNzIy0&ust=1627829537494000&source=images&cd=vfe&ved=0CAsQjRxqFwoTCPiJp-fIjfICFQAAAAAdAAAAABAD

 


https://www.acmicpc.net/problem/10870

 

10870번: 피보나치 수 5

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가

www.acmicpc.net

피보나치 수 5

시간 제한메모리 제한제출정답맞은 사람정답 비율

1 초 256 MB 41514 26259 22983 64.062%

문제

피보나치 수는 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번째 피보나치 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 n이 주어진다. n은 20보다 작거나 같은 자연수 또는 0이다.

출력

첫째 줄에 n번째 피보나치 수를 출력한다.

예제 입력 1 복사

10

예제 출력 1 복사

55

비슷한 문제

알고리즘 분류

 

👽해석👽

- 문제에서 정답을 알려주는 수준. 

Fn = Fn-1 + Fn-2

n=17일때 까지 피보나치 수를 써보면 다음과 같다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

0      1      2     3     4    5      6     7      8        9       10

 

- 0과 1은 자기자신을 그냥 보냄

- 2는 1이 되기 위해서 (2-2) + (2-1) = 1이 됨 즉 (n-2) + (n-1)이란 것 


https://www.acmicpc.net/problem/2447

 

2447번: 별 찍기 - 10

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이

www.acmicpc.net

별 찍기 - 10

시간 제한메모리 제한제출정답맞은 사람정답 비율

1 초 256 MB 33548 17283 12719 51.519%

문제

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.

크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.

*** * * ***

N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.

입력

첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3k이며, 이때 1 ≤ k < 8이다.

출력

첫째 줄부터 N번째 줄까지 별을 출력한다.

예제 입력 1 복사

27

 

 


https://www.acmicpc.net/problem/11729

 

11729번: 하노이 탑 이동 순서

세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로

www.acmicpc.net

하노이 탑 이동 순서

시간 제한메모리 제한제출정답맞은 사람정답 비율

1 초 256 MB 39147 19125 14850 48.668%

문제

세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로 옮기려 한다.

  1. 한 번에 한 개의 원판만을 다른 탑으로 옮길 수 있다.
  2. 쌓아 놓은 원판은 항상 위의 것이 아래의 것보다 작아야 한다.

이 작업을 수행하는데 필요한 이동 순서를 출력하는 프로그램을 작성하라. 단, 이동 횟수는 최소가 되어야 한다.

아래 그림은 원판이 5개인 경우의 예시이다.

입력

첫째 줄에 첫 번째 장대에 쌓인 원판의 개수 N (1 ≤ N ≤ 20)이 주어진다.

 

출력

첫째 줄에 옮긴 횟수 K를 출력한다.

두 번째 줄부터 수행 과정을 출력한다. 두 번째 줄부터 K개의 줄에 걸쳐 두 정수 A B를 빈칸을 사이에 두고 출력하는데, 이는 A번째 탑의 가장 위에 있는 원판을 B번째 탑의 가장 위로 옮긴다는 뜻이다.

예제 입력 1 복사

3

예제 출력 1 복사

7

1 3

1 2

3 2

1 3

2 1

2 3

1 3

출처

알고리즘 분류

 

<오답>

def move(no, x, y):
    if no >1:
        move(no -1,x,6-x-y)
    print(x,y)
    
    if no <1:
        move(no -1, 6-x-y, y)

n = int(input())


print(2**n-1)
move(n,1,3)

- 저번에 재귀함수를 공부하면서 하노이를 한 기억이 있어서 그 코드를 이용해서 풀었는데... 틀렸다고 나온다. 그래서 다시 풀기로 했다.


def hanoi(n,a,b,c): #n = 원반의 수, a = 1번 봉/ b = 2번 봉 / c = 3번 봉
    if n == 1: #원반이 1개인 경우
        print(a,c) #1번봉에 있다 3번 봉으로 가는 것을 의미
    else:
        hanoi(n-1,a,c,b) #맨 아래 봉을 제외하고 계속 진
        print(a,c)
        hanoi(n-1,b,a,c)


n = int(input())
print(2**n-1)
hanoi(n,1,2,3)