728x90
https://www.acmicpc.net/problem/20164
구현문제이다
또한 별 다른 알고리즘 없이, 세자리 이상인 경우에도 가능한 숫자 조합을 이중 for문으로 모두 만들어 주고 다시 호출했다
그렇지만...!! 내가 놓친부분은 바로 새로운 숫자 조합을 만들 때에도 홀수의 개수를 세는 것이다 ...
def check_odd(n):
# 1. 각 자리 숫자 중 홀수의 개수를 적는다.
temp = 0
for i in n:
if int(i) % 2 == 1:
temp += 1
return temp
check_odd는 하나씩 홀수의 개수를 세어주는 함수이다. n은 문자열로 처리하는 것이 편해서 문자열로 처리하고 있으며, int()로 형변환을 한 후 홀수의 개수를 하나씩 세어주고 있다.
문제에서 빨간 동그라미를 쳐준 것이 바로 check_odd() 함수가 하는 일이다..
간단한 걸 놓쳐서 엄청 삽질을 했다 ㅠㅠ
import sys
n = sys.stdin.readline().strip()
min_value = int(1e9)
max_value = 0
# 한자리 숫자일 때
def check_odd(n):
# 1. 각 자리 숫자 중 홀수의 개수를 적는다.
temp = 0
for i in n:
if int(i) % 2 == 1:
temp += 1
return temp
# n is string
def solve(n, count):
global min_value, max_value
if len(n) == 1: # 2. 수가 한자리 , then 종료
min_value = min(count, min_value)
max_value = max(count, max_value)
return
elif len(n) == 2: # 3. 두자리 수 는 2개로 나눠서 합 , 새로운 수 생성
new = str(int(n[0]) + int(n[1])) # 새로운 수 생성
return solve(str(new), count+check_odd(new)) # 재귀 호출, 새로운 숫자에 있는 홀수 개수를 누적해서 더함
else: # 세자리 이상인 경우
# 어떻게 나누지 ?
new_num = 0
for i in range(0, len(n)-2):
for j in range(i+1, len(n)-1):
# 나머지는 k
first = n[:i+1]
second = n[i+1:j+1]
third = n[j+1:]
new_num = str(int(first) + int(second) + int(third)) # 새로운 숫자 만들기
solve(new_num, count+check_odd(new_num)) # 새로운 숫자에 있는 홀수 개수 카운트를 누적해서 더함.
x = check_odd(n)
solve(n, x)
print(min_value, max_value)
728x90
'Algorithm (PS)' 카테고리의 다른 글
[백준] 22869번: 징검다리 건너기 small (파이썬/Python) - DP (0) | 2022.12.10 |
---|---|
[백준] 20444번: 색종이와 가위 (파이썬/Python) - 이진탐색 (0) | 2022.12.09 |
[백준] 1253번 : 좋다 (파이썬/Python) (0) | 2022.12.09 |
[백준] 1890번 점프 (파이썬/Python) - DP (0) | 2022.12.09 |
[백준] 18430 무기공학 파이썬/Python (0) | 2022.12.03 |