할껀하고놀자

[백준] 2231번 분해합 본문

[IT]/백준

[백준] 2231번 분해합

working_hard 2019. 10. 2. 00:23
728x90

완전탐색에 관한 공부를 진행하면서 풀이한 문제입니다.

종만북에서는 재귀를 공부했는데 풀이는 while로 풀었습니다;;

['1','2','3'] -> [1,2,3] 으로 바꾸는 마법코드를 배울 수 있었습니다.

li = list(map(int,li))

맵으로 한번 int 처리해주고 다시 list 화 시키면 되는 것 같습니다.

sum(li) 라는 고마운 함수를 이용하여 li 내부값을 모두 더해주고, 이것으로 답과 비교합니다.

 

아무것도 담기지 않았을 때 0을 반환해주었고, 그 이외에는 ans 에서 가장 작은 요소를 반환해주었습니다.

n = int(input())
ans = []

def solution(n):
    value = n
    while n!=0:
        li = list(str(n))
        li = list(map(int,li))
        # print(li)
        tmp = (n + sum(li))
        if tmp == value:
            ans.append(n)
        n-=1
    if len(ans)==0:
        return 0
    else:
        return min(ans)

print(solution(n))

 

다른 분들의 코드를 참고하고 싶었으나 파이썬으로 눈에 확 들어오는 코드는 없었습니다.

다만 c++ 코드가 저와 유사하여 첨부합니다.

#include <iostream>

using namespace std;

 

int N;

 

int findCreator(void)

{

        int creator = 1; //1부터 시작

 

        while (1)

        {

                 int copy = creator;

                 int sum = creator; //합은 생성자와 생성자의 각 자리 숫자의 합

 

                 while (copy) //각 자리 숫자의 합을 구한다

                 {

                         sum += copy % 10;

                         copy /= 10;

                 }

 

                 //조건 성립시 혹은 생성자가 없을 경우

                 if (creator == N || sum == N)

                         break;

 

                 creator++;

        }

 

        return creator;

}

 

int main(void)

{

        cin >> N;

 

        int result = findCreator();

 

        if (result == N)

                 cout << 0 << endl;

        else

                 cout << result << endl;

        return 0;

}

'[IT] > 백준' 카테고리의 다른 글

[백준] 13459번 구슬 탈출  (0) 2019.10.09
[백준] 5524번 입실  (0) 2019.09.29
[백준] 2935 소음  (0) 2019.09.29
[백준] 13420 사칙연산  (0) 2019.09.29
[백준] 1010번 다리놓기  (0) 2019.09.28
Comments