프로그램 명: upstair                                                                                                            제한시간: 1 초


최대 2 칸 까지 오를 수 있을 때 오르는 방법의 가짓수를 출력 하는 문제이다.

그림은 n 이 4 인 경우의 예 이다.

  • 1 - 2 - 3 - 4
  • 1 - 2 - 4
  • 1 - 3 - 4
  • 2 - 3 - 4
  • 2 - 4

입력

n 은 30 이하의 양의 정수이다.

출력

오를 수 있는 가짓 수를 출력한다.

입출력 예

입력

4

출력

5


[문제 풀이]

최대 2칸을 오를 수 있다는 것은, 한 번에 1칸 또는 2칸을 올라갈 수 있다는 뜻이다.

  • 1칸씩 올라가기 : 1 - 2 - 3 - 4
  • 1칸 - 1칸 - 2칸 : 1 - 2 - 4
  • 1칸 - 2칸 - 1칸 : 1 - 3 - 4
  • 2칸 - 1칸 - 1칸 : 2 - 3 - 4
  • 2칸씩 올라가기 : 2 - 4 
이렇게 입력받은 수(n)만큼 올라갈 수 있는 방법의 가짓 수를 출력하는 것이 목표이다.

[소스코드 설명]
stair()의 n은 목표 계단 높이, now는 현재 계단 높이를 말한다.
문제 풀이에서도 설명을 했듯이, 한 번에 1칸 또는 2칸을 올라갈 수 있다는 뜻이기 때문에 

1칸 올라가는 경우(stair(n, now + 1))와 2칸 올라가는 경우(stair(n, now + 2))를 모두 구해서
목표 계단 높이(n)과 같을 때까지 재귀 호출을 하였다.


'알고리즘 > 재귀' 카테고리의 다른 글

[재귀] 유클리드 호제법  (0) 2014.05.15
[재귀] x의 y 거듭제곱  (0) 2014.05.15
[Doc.] 재귀 (recursion)  (0) 2014.05.15
Posted by 밍쫑
,

프로그램 명: euclid

제한시간: 1 초

두 수를 입력받아 최대공약수,최소 공배수를 구하는 프로그램을 작성하시오.

입력

두 양의 정수 a , b 가 입력으로 주어진다. (1 <= a , b <= 100 000)

출력

최대공약수,최소공배수를 한 줄에 출력한다. 두 수의 최대공약수 와 최소 공배수는 정수 범위(2^31 - 1)를 넘지 않는다.

입출력 예

입력

8 12

출력

4 24


[문제 풀이]


유클리드 호제법

유클리드 호제법(- 互除法, Euclidean algorithm)은 2개의 자연수 또는 정식(整式)의 최대공약수를 구하는 알고리즘의 하나이다. 호제법이란 말은 두 수가 서로(互) 상대방 수를 나누어(除)서 결국 원하는 수를 얻는 알고리즘을 나타낸다. 2개의 자연수(또는 정식) a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면(단, a>b), a와 b의 최대공약수는 b와 r의 최대공약수와 같다. 이 성질에 따라, b를 r로 나눈 나머지 r'를 구하고, 다시 r을 r'로 나눈 나머지를 구하는 과정을 반복하여 나머지가 0이 되었을 때 나누는 수가 a와 b의 최대공약수이다. 

- Wiki, 위키백과 -


1. 입력으로 두 수 m,n(m>n)이 들어온다.

2. n이 0이라면, m을 출력하고 알고리즘을 종료한다.

3. n이 m을 나누어 떨어지면, n을 출력하고 알고리즘을 종료한다.

4. 그렇지 않으면, m을 n으로 나눈 나머지를 새롭게 m에 대입하고, m과 n을 바꾸고 3으로 돌아온다.


최소공배수(lcm) = (A*B) / gcd(A, B);




'알고리즘 > 재귀' 카테고리의 다른 글

[재귀] 계단 오르기  (0) 2014.05.15
[재귀] x의 y 거듭제곱  (0) 2014.05.15
[Doc.] 재귀 (recursion)  (0) 2014.05.15
Posted by 밍쫑
,

프로그램 명: powerofx

제한시간: 1 초

x 의 y 거듭제곱을 구하는 문제이다.

2 10 을 입력 받으면 2 의 10 거듭제곱 1024 가 출력되어야 한다.

2^10 = 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2=1024

입력

두 정수 x , y 가 입력된다.

출력

x 의 y 거듭제곱된 결과값을 출력한다.

출력 결과는 정수 범위( 2^31 - 1)를 넘지 않는다.

입출력 예

입력

2 10

출력

1024


[소스코드 풀이]

지수(y)의 숫자 만큼 밑수(x)를 곱하기 때문에, y가 1이 될 때까지 재귀적으로 함수를 호출해서 밑수를 계속 곱해준다.



'알고리즘 > 재귀' 카테고리의 다른 글

[재귀] 계단 오르기  (0) 2014.05.15
[재귀] 유클리드 호제법  (0) 2014.05.15
[Doc.] 재귀 (recursion)  (0) 2014.05.15
Posted by 밍쫑
,

재귀(Recursion)


수학이나 컴퓨터 과학 등에서 자신을 정의할 때 자기 자신을 재참조하는 방법을 뜻한다. 주로 이 방법은 함수에 적용한 재귀 함수(Recursion Function)의 형태로 많이 사용된다.

-  Wiki, 위키 백과 -




특징

  • 구현하려는 알고리즘 자체가 재귀적 특성을 갖는다면, 재귀 함수를 이용하면 쉽게 구현이 가능하다.
  • 프로그램 내의 반복문은 재귀호출로 바꿀 수 있으며, 그 반대로 재귀호출은 반복문으로 고쳐 쓸 수 있다.
  • 일반적으로 재귀 함수는 반복문을 이용한 함수로 변환이 가능


long factorial(int number)

{

...

factorial(number - 1);    // 함수 내부에서 자기 자신의 함수를 호출 (재귀함수)

...

}





n!

    • 수식 n! (n factorial)은 1 * 2 * 3 * ... * (n-2) * (n-1) * n 을 의미

계승 수식은 재귀적 특성을 갖음

    • 즉 n!을 구하기 위해서 (n-1)!을 먼저 구한다면 쉽게 n!을 구할 수 있음
    • 그러나 재귀적 호출이 종료되는 조건이 없다면 무한 호출에 의해 문제가 발생
if (n<=1)
n! = 1
else
n! = n * (n-1)!

long factorial(int number)

{

if (number <= 1)

return 1;

else

return (number * fatorial (number -1));

}





피보나치 수

  • 다음 수가 앞의 두 수의 합이 되는 수열

0    1    1    2    3    5    8    13    21    ...

  • n번째 수를 Fn이라 하면, Fn은 다음과 같이 재귀적으로 표현

  • 피초나치 수를 발생시키는 프로그램을 작성한다면 재귀적 특성을 이용하여 쉽게 구현 가능.

int fibo(int n)

{

if (n==0)    return 0;

else if (n==1)    return 1;

else    return return fibo(n-1) + fibo(n-2);

}


main()

{

printf("%d", fibo(4));

}



  • 반복적 방법을 이용하여 구현

long fibo (int n)

{

int fn, fn1, fn2;

int i;


if (n <=1)    return n;

else {

fn2 = 0;

fn1 = 1;

for (i=2; i<=n; i++) {

fn = fn1 + fn2;

fn2 = fn1;

fn1 = fn;

}

return fn;

}

}



팩토리얼 문제나 피보나치 수열 문제 말고도 재귀를 대표하는 문제들을 많이 있습니다. (ex. 하노이의 탑)

'알고리즘 > 재귀' 카테고리의 다른 글

[재귀] 계단 오르기  (0) 2014.05.15
[재귀] 유클리드 호제법  (0) 2014.05.15
[재귀] x의 y 거듭제곱  (0) 2014.05.15
Posted by 밍쫑
,

증가-팬린드롬


문제 

양의 정수의 수열이 주어질 때 앞으로 읽던 뒤로 읽던 같은 수열이면 “팰린드롬“이라고 한다.


예를 들어, 두 수열은 “팰린드롬” 이다.


23 11 15 1 37 37 1 15 11 23

1 1 2 3 4 7 7 10 7 7 4 3 2 1 1


“팰린드롬” 수열 중 중간 위치에 있는 수까지 감소하지 않는 수열은 “증가-팰린드롬”이라고 한다.


23 11 15 1 37 37 1 15 11 23   => “증가-팰린드롬”이 아니다.

1 1 2 3 4 7 7 10 7 7 4 3 2 1 1  => “증가-팰린드롬”이다.


양의 정수 N이 주어질 때 수열의 합이 N이 되는 “증가-팰린드롬”의 개수를 구하라. 


주어지는 입력의 경우의 수는 64 비트 정수로 표현이 가능하다.


몇가지 보기를 보면,


1: (1)

2: (2), (1 1)

3: (1 1 1)

4: (4), (1 2 1), (2 2), (1 1 1 1)

5: (5), (1 3 1), (1 1 1 1 1)

6: (6), (1 4 1), (2 2 2), (1 1 2 1 1), (3 3), (1 2 2 1), (1 1 1 1 1 1)

  

예제 입력​1

2

예제 출력1

2

예제 입력​2

8

예제 출력2

11

출제자 : 안일규


Posted by 밍쫑
,

멤버십 복사기


문제 

560 * 400 밀리미터 이미지를 표준 용지( 218 * 280 mm) 로 복사하려고 한다. 

이 복사기는 축소 기능이 있어 용지에 맞게 가능한 크게 복사하려고 하는 경우 50 % 축소 복사하면 된다.

물론 90 도 회전 할수도 있다.( 랜드스케이프 모드) 

                             

문제는 복사할 이미지와 복사용지가 주어질 때 이 이미지를 복사용지에 잘림이 없이 최대로 넣기 위한 위한 축소 % 를 구하는 문제이다. 


 

입력

4 개의 정수가 입력으로 주어진다. 처음 두 수는 복사할 이미지의 크기이고 다음 두 수는 복사용지의 크기이다. 

출력

답은 1 에서 100% 사이의 정수이다. 


예제 입력1

560 400 218 280

예제 출력1

50%

예제 입력​2

10 25 88 10

예제 출력2

100%

출제자 : 박종범


Posted by 밍쫑
,

쉼표


문제 

세 자리 마다 쉼표를 찍는 프로그램을 작성하세요.

 

입력

공백없이 100 자리이하의 수가 입력으로 주어진다. 무효의 0은 입력되지 않는다.


출력

출력 예의 형식으로 출력한다.

 

예제 입력​

1234

예제 출력

1,234


출제자 : 임현수


Posted by 밍쫑
,

돈줍기


문제 

N 개의 돈이 놓여있다. 돈을 마음껏 주워갈 수 있다. 단, 연속해서 3개 이상의 돈을 줍지는 못한다.

가장 많은 돈을 줍는 프로그램을 만들어 보자.

 

입력

1<=N<=1000, 돈의 크기는 100 이하이다.


출력

가장 많이 주울 수 있는 돈의 액수를 출력하라.

 

예제 입력​

8
5 7 10 1 2 10 11 6

예제 출력

38


입출력 예

7 + 10 + 10 + 11 = 38

출제자 : 안일규


Posted by 밍쫑
,
멤고리즘 5회 2번 문제 멤고리즘 / 알고리즘

2014/04/26 09:28

복사 http://blog.naver.com/justant/20209498706

전용뷰어 보기

2등신 영훈이


문제 

2진수 나라의 2번째 왕자 2등신 영훈이는 8등신 밖에 없는 삼성전자 임원면접에 합격하기 위해 8등신이 되려한다.

8등신인 우리는 2등신 영훈이를 8등신으로 바꿔주는 알고리즘(2진수 -> 8진수)을 구현하려 한다.

 

입력

100 자리를 넘지 않고 첫 수는 1로 시작한다.


출력

대응되는 8진수를 출력한다.

 

예제 입력​1

1010

예제 출력1

12


예제 입력​2

11001100

예제 출력2

314

출제자 : 임현수


Posted by 밍쫑
,

멤고리즘 랭킹


문제 

요즘 멤고리즘 랭킹은 준수가 직접 수작업으로 계산하고 있다. 

그래서, 힘든 우리 준수를 위해 랭킹을 정해주는 프로그램을 만들어 주려고 한다. 


프로그램의 규칙의 다음과 같다.

85점, 105점, 92점을 받았다면, 각각 3등, 1등, 2등이다. 드물게 동점자가 나오는 경우도 있다. 예로 90, 100, 90, 80 점을 맞은 경우에는, 2등, 1등, 2등, 4등으로 처리하도록 한다. 

 

입력

첫째 줄에는 사람의 수 N(1000 이하 정수)이 주어진다. 

다음줄부터는 각 사람의 점수가 주어진다. 점수는 1000 이하의 정수이다. 

출력

입력된 순서대로 각 사람이 몇 등인지를 출력한다. 

 

예제 입력​

5
97
65
84
84
91

예제 출력

1
5
3
3
2


출제자 : 박종범


Posted by 밍쫑
,