Algorithm/Baekjoon

Baekjoon 2231번 분해합, 2798번 블랙잭

Hoin.s 2024. 5. 8. 16:54

2231번 분해합

123이라는 입력값이 들어왔을 때 이걸 쪼개서 다른 변수에 저장하게끔 만들어주면 될 것 같다.

n = int(input())  #분해합을 입력값으로 받음

for i in range(1, n+1):   #생성자 찾기
    num = sum((map(int, str(i))))  # i의 각 자릿수를 더함
    num_sum = i + num  # 분해합 = 생성자 + 각 자릿수의 합
    # i가처음으로 분해합과 입력값이 같을때가 가장 작은 생성자를 가짐.
    if num_sum == n:
        print(i)
        break
    if i == n:  #i와 입력값이 같으면 생성자 없는거.
        print(0)

 

분해합 값을 입력받고 1부터 분해합까지의 범위 안에서 반복문을 작동시켜준다.

i의 각 자릿수를 모두 더하여 분해합을 구한다. 반복마다 i의 각 자릿수를 모두 더하여 분해합을 계산하는데 분해합을 구하기 위해서는 생성자 i와 i의 각 자리수 합이 필요하기 때문에 각 자리수 합도 구해준다. 분해합이 입려값이랑 같으면 생성자를 찾은거니까 반복문을 종료하고 생성자를 찾지 못했다면 0을 출력한다.

 


2798번 블랙잭

N, M = map(int, input().split()) #카드 개수 N과 합의 한도 M을 입력받음.
lst = list(map(int, input().split()))#N개 만큼의 카드에 쓰여 있는 수를 입력받음.
nlst = []
#중첩 반복문을 사용해서 모든 경우의 수의 합을 구해서 새로운 리스트에 넣음.
for i in range(N):
    for j in range(i+1, N):
        for k in range(j+1, N):
            three =  lst[i] + lst[j] + lst[k]
            if three > M:#모든 경우의 수의 합이 M을 초과하면 반복문 진행, 작으면 새로운 리스트에 해당 값 추가.
                continue
            else:
                nlst.append(three)
print(max(nlst))#max 사용해서 가장 큰 값 출력.

코드 설명은 주석으로 달아두었다. 

중첩 반복문 사용이 어려웠다. + 구글링의 도움.

그래도 코드 흐름을 익힐 수 있어서 좋았던 문제다.