프로그램 명: luckynum(open)
제한시간: 1 초
4 나 7로 이루어져있는 수를 행운의 숫자라고 한다.

다음은 처음 5개의 행운의 숫자다.

4, 7, 44, 47, 74...

정수 k가 주어졌을 때 k번 째 행운의 숫자를 구하는게 문제다.

입력

정수 k( 1<= k <= 10^9) 가 주어진다.

출력

k번 째 행운의 숫자를 출력한다.

입출력 예

입력

5

출력 

74
출처: 2010-2011 October COCI Q3
번역+추천: likepad


[문제 풀이]

4, 7, 44, 47, 74, 77, 444, 447, 474, 477, 744, 747, 774, 777, ....


[소스코드 설명]

이번 문제는 재귀함수를 이용해서 풀어보았습니다.


재귀(再歸, Recursion)는 수학이나 컴퓨터 과학 등에서 자신을 정의할 때 자기 자신을 재참조하는 방법을 뜻한다. 주로 이 방법은 함수에 적용한 재귀 함수(Recursion Function)의 형태로 많이 사용된다. 또, 사진이나 그림 등에서 재귀의 형태를 사용하는 경우도 있다.

- Wiki, 위키백과 -


일단 위에 문제 풀이를 보시면서 규칙이 보이시나요?

만약 제 이전 알고리즘 포스팅을 보신 분이라면 어떤 규칙인지 아실텐데요.

네, 바로 홀수번째와 짝수번째로 나뉘어진 규칙입니다.

홀수 : 4, 44, 74, 444, 474, 744, 774, ...    // 4로 끝나고 있다.

짝수 : 7, 47, 77, 447, 477, 747, 777, ...    // 7로 끝나고 있다.


1의자리가 홀수번째에는 4이고, 짝수번째에는 7로 나타나고 있습니다.



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

[for문] 약수의 개수, 총합 (1일차)  (0) 2014.04.15
[for문]1의 위치 (1일차)  (0) 2014.04.15
Posted by 밍쫑
,
프로그램 명: ft
제한시간: 1 초

자연수가 입력으로 주어진다. 이 수의 약수를 출력하고 , 다음 줄에는 약수의 개수 , 다음 줄에는 약수의 총합 , 다음 줄에는 약수의 곱의 일의 자리수를 출력한다.

입력

주어지는 수는 1000 이하의 자연수이다.

출력

입출력 예

입력

6

출력

1 2 3 6
4
12 

6


[문제 풀이]

문제는 크게 어려운 부분이 없습니다.

입력한 숫자의 약수와 약수의 갯수와 그 약수들의 곱을 구하는 문제입니다.


[소스코드 설명]

저는 먼저, 약수의 갯수를 세주는 count를 선언해주었습니다.

그리고 입력된 값 n이 for문을 돌면서 나누어 떨어지면 약수가 맞기 때문에 arr 배열에 값을 넣어주고 count값을 증가시켜주는 식으로 했습니다.



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

[for문] 행운의 숫자(lucky number) (1일차)  (1) 2014.04.16
[for문]1의 위치 (1일차)  (0) 2014.04.15
Posted by 밍쫑
,
프로그램 명: bit_pos
제한시간: 1 초

양의 정수 n 을 입력으로 받아 이 수를 이진수로 나타내었을 때 1 이 나타나는 위치를 구하는 것이 문제이다.

수를 이진수로 나타내었을 때 가장 오른쪽의 자리를 LSB(Least Significant Bit)라 한다. LSB 를 0 번 위치로 간주한다.

입력

양의 정수 n 이 입력으로 주어진다. ( 1 <= n <= 10^6 )

출력

1 이 나타나는 위치를 모두 출력한다.

입출력 예

입력

13

출력

0 2 3 

출처: Central European Programming Contest 


[문제 풀이]

이 문제의 경우 10진수를 2진수로 바꾼 후에 1이 나타나는 위치를 찾는 문제입니다.

주어진 예제에서 13의 경우 2진수로 바꾸면 1101 이 됩니다.

문제에서 제일 오른쪽에서부터 0으로 시작한다 하였으니, 

현재 1이 나타나는 위치는 오른쪽에서부터 순서대로 0, 2, 3이 됩니다.

 1

 0

1

1

 0

 1

[소스코드 설명]

저는 짝수일 때와 홀수 일때에 대해서 따로 생각을 했습니다.


홀수 : 0001(1), 0011(3), 0101(5), 0111(7), 1001(9), 1011(11), 1101(13), ...

짝수 : 0010(2), 0100(4), 0110(6), 1000(8), 1010(10), 1100(12), 1110(14), ...


혹시 규칙이 보이시나요?

홀수의 경우 0의 자리가 무조건 1로 끝나고, 짝수의 경우 0의 자리가 무조건 0으로 끝나게 됩니다.

그래서 저는 "isFirst" 라는 것을 선언해서 홀수면서 처음나누어지는 것에 대해서는 무조건 1임을 나타내서 출력할 때 0도 포함이 되게 하였습니다.(1011)


그 다음 10진수를 2진수로 바꾸는 것을 손으로 직접 해보시면 아시겠지만, N값이 1이 될 때까지 계속 나눕니다. 따라서 N이 1이되면 break;로 계산을 멈추게 하였습니다.


그리고 2진수로 바꾸는 것이기 때문에 한 번 계산이 끝날 때마다 N값을 N/2로 갱신해주었습니다.



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

[for문] 행운의 숫자(lucky number) (1일차)  (1) 2014.04.16
[for문] 약수의 개수, 총합 (1일차)  (0) 2014.04.15
Posted by 밍쫑
,