😁 빅데이터 문제 풀기 & Study/- BAEKJOON 문제

[2331] 분해합 / 파이썬 (이렇게 무식하게 하나하나 대입하는거라고?)

또방91 2021. 11. 30. 11:10
728x90

문제 링크: https://www.acmicpc.net/problem/2231

 

2231번: 분해합

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

www.acmicpc.net


1차시도 실패

입력에서 주어진 자연수 조건을 잘 살펴보지 않고.......

문제와 예제 입력에 주어진 수들에 꽂혀서 작성해부림...ㅠ 하 창피하다.....

#pqr이란 수의 분해합은 100p+10q+r+p+q+r = 101p+11q+2r 구함
#규칙을 찾아보면 생성자는 (101로 나눈 몫) (11로 나눈 나눈 몫) (2로 나눈 몫)으로 구성됨
#단! 마지막에 나머지가 0으로 딱 떨어지지 않으면 (몫-1) 해줘야함
n=int(input())

a= (n//101)
a_1= n % 101 #나머지

b= a_1 // 11
b_1= a_1 % 11 #나머지

c= b_1 // 2

if b_1%2==0: print(100*a+10*b+c)

else:
    x= (n // 101) - 1
    x_1= n - (101*x) #나머지
        
    y= (x_1 // 11) - 1
    y_1= x_1 - (11*y) #나머지

    z= y_1 // 2 

    print(100*x + 10*y + z)

정답은 ??

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 2차시도 (성공)-----------------------
 
n=int(input())
 
#숫자 반절부터 찾아보기
for sample in range(n//2,n):
    
    #각 숫자들을 넣어줄 작업공간(리스트) 만들기
    workbench=[] 
    
    #샘플 숫자를 하나씩 문자열로 나눠주기
    for i in str(sample):
        workbench.append(int(i)) 
    
    #각 숫자 합과 숫자자신 더하기!
    if n == sum(workbench) + sample: 
        print(sample)
        break
 
#없을 경우
elseprint(0)
cs

 


💯 풀이 과정

무식하게 하나하나 대입해보자라는 생각으로 시작....!

그래도 반절이상 수부터 시작하였다.

예를들어 100이라고 하면 50이상부터해야지.... 1,2,3... 이런 작은 수들이 100을 만들지 않았을 테니

 

1) for 반복문으로 숫자반절부터 범위를 설정하고 샘플들을 하나씩 대입하여 찾아본다

2) 각 숫자들을 넣어줄 리스트를 만들고 for반복문으로 샘플의 각 자리수를 하나씩 떼어서 넣어준다

3) if문으로 생성자가 맞는지 확인하고, 맞다고하면 코드식을 끝내야하니 break를 쓴다

4) 만약에 생성자가 없으면 0을 출력해야하니 else를 써준다.

(사실.... 반복문돌았는데 답이 없으면 else를 써서 표현해도 된다는걸 이번에 알앗다.. 한번 해볼까? 했는데 우연히 알게 되었다.😅)  

 

 

이렇게 하나씩 무식하게 대입해서 찾는 알고리즘이 <브루트포스 알고리즘>이라고 한다... 한번 공부 해봐야지-!


😎오늘의 한줄평: 무식하게 대입하는 것도 방법이 될수 있다...

728x90