본문 바로가기
개발공부/문제풀기

백준 2231 - 분해합

by 맙소사 2022. 3. 17.

분해합 ( https://www.acmicpc.net/problem/2231 )

처음 푼 코드는 시간초과가 나왔다... 

1
2
3
4
5
6
7
8
9
10
11
12
13
= input()
cnt = 1
 
while True :
    m = cnt
    num_list = list(str(cnt))
    for i in num_list:
        m += int(i)
    if m == n :
        break
    else :
        cnt += 1
print(cnt)
cs

지금 다시 보니까 생성자가 없는 경우 0을 출력해주는 코드를 빼먹었다. 엥? 싶어서 돌려봤는데 틀렸다고 나옴 왜지?

아까 풀었을땐 그래도 답이 나오긴 했는데 ? ? 잉 ? ? 그래서 다시 풀다가 계속 실패해서 구글링 해버림 . . .

참고한 사이트 : https://goplanit.site/50.%20Algorithm(2231_py)/ 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 분해합의 생성자를 구해야 한다. 
# n: 입력된 분해합 / m: 생성한 분해합 / i: 생성자가 되기 위해 1씩 증가하는 친구
def decompose():
    # 입력된 분해합
    n = int(input()) # 198 + 1 + 9 + 8
 
    # 생성자에 값을 더해서 분해합을 도출하기 때문에
    # 생성자는 입력값을 넘지 않는다!
    # 그래서 입력값만큼 회전
    for i in range (n + 1) :
 
        # 분해합 생성 공식 ( 무지성포문 대신 내장함수를 이용... )
        m = i + sum(map(intstr(i)))
        # 여기서 i에 바로 그냥 분해합공식을 적용해 분해합으로 만드려고 하는데 오류발생
        # 마지막인걸 구분하는 if문을 위로 올려도 오류가 발생 (왜지 ??)
        
        # 생성한 분해합과 입력된 분해합이 같은 값이라면
        if m == n :
            print(i)
            break
 
        #마지막에 도달해서 값이 없을 경우
        if i == n:
            print(0)
cs

덕분에 좋은 함수를 알았다. sum()과 map()이다.

 

sum()은 리스트 내 숫자를 전부 더해줌. 쿼리 쓸 때 사용하는 함수랑 비슷한 역할이라고 생각하면 될 것 같고

 

map()은 map(int, list) 이런 식으로 활용이 가능하다. 두 번째 칸에는 숫자로 쓰인 문자열을 넣어도 되고 리스트를 넣어도 되는데 기존의 리스트를 변환하는것이 아니라 새 리스트를 리턴하기 때문에 변수에 할당해주어야 함.

python map에 대한 활용을 알아볼 수 있는 링크 : https://dojang.io/mod/page/view.php?id=2286 

 

'개발공부 > 문제풀기' 카테고리의 다른 글

백준 1920 - 수 찾기  (0) 2022.03.21
백준 2525 - 오븐시계  (0) 2022.03.20
백준 1259 - 팰린드롬수  (0) 2022.03.17
백준커리큘럼  (0) 2022.01.18
백준 2916번 - 저작권  (0) 2021.11.18

댓글