[백준 2231번] 분해합 (C++)

2023. 12. 15. 17:10·PS/백준 알고리즘[BOJ]
728x90

1. 문제

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

 

2231번: 분해합

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이

www.acmicpc.net

 

2. 풀이

아이디어

제한 시간이 2초인 만큼 모든 수를 선형탐색해도 시간이 넉넉하다. 따라서 1부터 N까지 반복문을 다음 수를 만들면 된다. 분해합이 N이 되는 순간 반복문을 멈추고 바로 답을 출력하면 통과 시간을 최대한 빠르게 할 수 있다.

분해합을 구하는 과정은 [자릿수 분해] 알고리즘을 사용한다. 

알고리즘 순서

  1. 1 ~ N까지 반복문을 돌며 현재의 숫자의 분해합을 만든다.
  2. i번째 숫자로 만들 수 있는 분해합이 N이 된 순간 반복문을 멈추고 답을 출력한다.

구현

#include<iostream>
using namespace std;

int N, ans;
bool flag;

void constructure(int n){
    int sum = n;
    int temp = n;
    while(n != 0){
        sum += n % 10;
        n /= 10;
    }
    if(sum == N) {
        flag = true;
        ans = temp;
    }
}

int main(void){
    ios_base::sync_with_stdio(0);
    cin >> N;
    for(int i=1; i<=N; i++) {
        constructure(i);
        if(flag) break;
    }
    if(flag) cout << ans;
    else cout << 0;
    return 0;
}

 

알고리즘 분석

위의 알고리즘의 시간 복잡도는 O(N)이다. 최악의 경우(N = 10⁶일 때 분해합이 존재하지 않는 경우) O(N) = 10⁶이므로 2초의 시간내에 충분히 통과가능하다. 다만 원하는 조건이 나왔을 경우 탐색을 멈추면 조금 더 빠른 시간내에 통과할 수 있다.

[두 방법의 시간 복잡도 비교]

1 ~ N까지 완전 탐색을 하였을 경우

원하는 조건이 나왔을 때 탐색을 멈춘 경우

두 방식의 시간 복잡도는 10배 넘게 차이가 나는 것을 알 수 있다.

 

3. 정리

자릿수 분해를 연습하기 좋은 문제다. 다음은 이와 비슷한 문제이다.

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

 

4673번: 셀프 넘버

셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,

www.acmicpc.net

 

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

 

12348번: 분해합 2

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이

www.acmicpc.net

 

728x90
저작자표시 비영리 (새창열림)

'PS > 백준 알고리즘[BOJ]' 카테고리의 다른 글

[백준 10026] 적록색약 (C++)  (0) 2023.12.19
[백준 00000] 치즈 (C++)  (0) 2023.12.19
[백준 2217번] 로프 (C++)  (1) 2023.12.11
[백준 2293번] 동전1 (C++) (시행착오부터 DP를 떠올리기까지의 아주 자세한 사고과정 기록)  (2) 2023.11.08
[백준 28323번] 불안정한 수열 (C++) (한국정보올림피아드 KOI 2323 2차대회)  (0) 2023.11.02
'PS/백준 알고리즘[BOJ]' 카테고리의 다른 글
  • [백준 10026] 적록색약 (C++)
  • [백준 00000] 치즈 (C++)
  • [백준 2217번] 로프 (C++)
  • [백준 2293번] 동전1 (C++) (시행착오부터 DP를 떠올리기까지의 아주 자세한 사고과정 기록)
BE_개발자
BE_개발자
경이로운 BE 개발자가 되기 위한 프로그래밍 공부 기록장
    250x250
  • BE_개발자
    경이로운 개발일기
    BE_개발자
  • 전체
    오늘
    어제
    • 전체 보기 (213)
      • AI (1)
        • AI native (0)
        • Skill (0)
      • SpringBoot (4)
        • JPA (3)
        • Security (0)
        • 튜토리얼 (1)
        • 기타 (0)
      • Infra (0)
        • Docker (0)
        • AWS (0)
        • NCP (0)
        • GCP (0)
      • React (19)
      • 서버 (0)
      • Computer Science (16)
        • SW Engineering (10)
        • Data Base (2)
        • OS(운영 체제) (4)
      • Data science (0)
        • Probability & Random Variab.. (0)
        • Data Analysis(데이터 분석) (0)
      • 자료구조 | 알고리즘 (57)
        • 선형 자료구죠 (6)
        • 비선형 자료구조 (9)
        • 정렬(Sort) (3)
        • 탐색(Brute Force) (7)
        • 분할 정복(Devide Conquer) (3)
        • 동적 계획법 (6)
        • 탐욕(Greedy) (2)
        • 수학 (7)
        • 심화 알고리즘 (10)
      • PS (44)
        • 백준 알고리즘[BOJ] (38)
        • 프로그래머스[programmers] (3)
      • Dev tool (15)
        • 개발 도구 및 환경 (0)
        • vscode (3)
        • Git Hub (4)
        • Chrome 웹스토어 (5)
        • Python 전용 개발환경 (0)
      • 성장기록 (1)
      • 개인 project (14)
        • 홈페이지 만들기 (11)
        • 냉보미 (1)
      • STL(Standard Library) (9)
      • programming Language (1)
        • javascript (1)
      • 기타 (13)
        • html css (11)
      • (책, 글, 블로그)리뷰 (3)
  • 블로그 메뉴

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

    • 백준
    • Github
    • Notion
    • 서울과학기술대학교 학술동아리 EC
  • 공지사항

  • 인기 글

  • 태그

    알고리즘
    완전 탐색
    SW Engineering
    DP
    재귀함수
    운영체제
    OS
    react
    PS
    C++
    분할정복
    그리디
    stack
    수학
    BFS
    브루트포스
    백트래킹
    stl
    탐색
    비트마스킹
    프론트엔드
    스프링부트
    괄호쌍
    순열
    이분 탐색
    자료구조
    SW 공학
    CS
    백준
    스택
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
BE_개발자
[백준 2231번] 분해합 (C++)
상단으로

티스토리툴바