Algorithm/백준문제
[Baekjoon]2798번 블랙잭
bestwish
2022. 6. 30. 20:05
문제
어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다.
어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 된다.
따라서 245는 256의 생성자가 된다.
물론, 어떤 자연수의 경우에는 생성자가 없을 수도 있다. 반대로, 생성자가 여러 개인 자연수도 있을 수 있다.
자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그램을 작성하시오.
Python3 답
n, m = map(int, input().split())
l = list(map(int,input().split()))
result = 0
for i in range(n):
for j in range(i+1, n):
for a, k in enumerate(range(j+1, n)):
if result < (l[i] + l[j] + l[k]):
if m >= (l[i] + l[j] + l[k]):
result = (l[i] + l[j] + l[k])
print(result)
코드풀이
10단계는 브루트 포스 알고리즘이다.
brute 단순히, force 힘으로 단순하게 힘만 갖고 밀어 붙인다는 소리이다.
완전탐색 알고리즘으로 가능한 모든 경우의 수를 탐색하면서 요구조건에 충족되는 결과를 가져온다.
참고
나는 l에 1, 2, 3, 4, 5가 들어왔다고 생각하고, i가 1일 때를 가정해봤다.
아래 표처럼 나타난다.
1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
○ | ○ | ○ | ||
○ | ○ | ○ | ||
○ | ○ | ○ | ||
○ | ○ | ○ | ||
○ | ○ | ○ | ||
○ | ○ |
카드를 3장을 뽑으니, for문이 3번 반복될꺼라 생각하고, 코드를 짰다.
2번째 ○와 3번째 ○의 시작지점을 어떻게 짜야하는가?에서 시간이 조금 걸렸지만 어렵지는 않은 문제였다.