[백준] 1407번 - 2로 몇 번 나누어질까 (C언어) [Gold4]

2023. 5. 27. 17:06·알고리즘

input1 output1 input2 output2 input3 output3
176 177 17 5 9 13 25 28 8

해당 문제는 자연수 N이 홀수인 경우와 짝수인 경우로 나누어 생각하면 쉽게 해결가능한 문제이다. 문제 해석 먼저 해보자.

  • 홀수 인 경우 f(n) 의 값은 무조건 1이다. 
  • 짝수인 경우
    • f(2) = 2, f(4) =4, f(6) = 2 * f(3) ...

문제에서 원하는 수식의 값을 구해보자. S(n) = f(1) + f(2) + f(3) + ... + f(n-2) + f(n-1) + f(n) 이다. 점화식으로 표현하면 S(n) = S(b) + S(a-1) 이다.

 

다시 홀수 와 짝수의 경우로 알고리즘을 생각해보면 아래와 같다.

if n % 2 == 0
		f(n/2) = 1 // 짝수를 나누면 홀수
	else
		f(n/2) + 1 = 1

이를 의사 코드로 표현해보자.

.

==> 재귀함수로 표현 가능
	if(n % 2 ==0)
		S(n) = n / 2 + S(n/2)
	else
		S(n) = n / 2 + S(n/2) + 1

전체 소스 코드는 아래와 같다. (범위 제한 때문에 long long int 사용)

#include <stdio.h>
#pragma warning(disable:4996)
long long int func(long long int n) {
	if (n == 0) // 재귀 종료 시점
		return 0;
	else if (n == 1) 
		return 1;
	else if (n % 2 == 0)
		return (n / 2) + 2 * func(n / 2);
	else if (n % 2 == 1)
		return (n / 2) + 2 * func(n / 2) + 1;
}
int main() {
	long long int a, b;

	scanf("%lld%lld", &a, &b);

	long long int result = func(b) - func(a - 1);

	printf("%lld", result);

	return 0;
}

 

[1407번]

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

 

1407번: 2로 몇 번 나누어질까

자연수 N이 주어지면, 자연수를 유지하면서 N을 2로 몇 번까지 나눌 수 있는지를 생각해 볼 수 있다. 즉, N의 모든 약수 중 2의 거듭제곱 꼴이면서 가장 큰 약수를 생각하는 것이다. 예를 들어 15의

www.acmicpc.net

 

[github]

https://github.com/MinWook6457

 

MinWook6457 - Overview

MinWook6457 has 19 repositories available. Follow their code on GitHub.

github.com

 

 

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

[백준] 1937번 - 욕심쟁이 판다 (C언어) [Gold3]  (0) 2023.05.29
[백준] 1260번 - DFS와 BFS (C언어) [Silver2]  (0) 2023.05.28
[백준] 1197번 - 최소 스패닝 트리 (C언어) [Gold4]  (0) 2023.05.26
[백준] 1874번 - 스택 수열 (C언어) [Silver2]  (0) 2023.05.25
[백준] 1913번 - 달팽이 (C언어) [Silver3]  (2) 2023.05.24
'알고리즘' 카테고리의 다른 글
  • [백준] 1937번 - 욕심쟁이 판다 (C언어) [Gold3]
  • [백준] 1260번 - DFS와 BFS (C언어) [Silver2]
  • [백준] 1197번 - 최소 스패닝 트리 (C언어) [Gold4]
  • [백준] 1874번 - 스택 수열 (C언어) [Silver2]
min._.uuk_
min._.uuk_
하루 하나 기록하기
  • min._.uuk_
    기록하는 습관
    min._.uuk_
  • 전체
    오늘
    어제
    • 분류 전체보기 (33)
      • 알고리즘 (15)
      • 자바 스크립트 (2)
      • 인실리코젠 (15)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    #BOJ #백준 #10989번 #C언어 #카운팅정렬 #정렬
    Apache #POI #JAVA #maven
    백준 #BOJ #스택 #수열
    백준 #1407번 #재귀함수
    백준 #동적계획법 #dp #백트래킹 #dfs
    백준 #세그먼트 트리 #구간합 #c언어 #골드1 #탐색
    인실리코젠 #크롤링 #SpringBoot #MVC #jQuery
    백준 #MST #최소비용신장트리 #크루스칼 #그리디 #알고리즘
    백준 #후위표기식 #스택 #중위표기식 #우선순위 #1918번
    JS #테트리스 #HTML #CSS #추억의 게임
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
min._.uuk_
[백준] 1407번 - 2로 몇 번 나누어질까 (C언어) [Gold4]
상단으로

티스토리툴바