알고리즘/백준

[python/1463]1로 만들기

(ㅇㅅㅎ) 2020. 4. 21. 22:27
728x90
반응형

https://www.acmicpc.net/problem/1463

 

1463번: 1로 만들기

첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.

www.acmicpc.net

정수 X를 10이라고 가정하고 위의 3가지 규칙을 적용하면 아래 그림과 같습니다.

이것을 단계별로 나누면 3단계에서 1을 처음 볼 수 있습니다.

X를 N이라고 가정하고 단계를 리스트에 저장하는 방법은 아래와 같습니다.

lst = []
for i in N:
    # 규칙 3
    lst.append(i - 1)
    # 규칙 1
    if i % 3 == 0:
        lst.append(i // 3)
    # 규칙 2
    if i % 2 == 0:
        lst.append(i // 2)

이 리스트에 중복 값이 있을 수 있기 때문에 중복을 제거해 주어야 합니다.

lst = []
for i in N:
    # 규칙 3
    lst.append(i - 1)
    # 규칙 1
    if i % 3 == 0:
        lst.append(i // 3)
    # 규칙 2
    if i % 2 == 0:
        lst.append(i // 2)
# 중복 제거
lst = list(set(lst))

이것을 Make_1이라는 함수로 만들어줍니다. 그다음 단계에 1이 있을 때까지  while 문을 이용하여 반복시킵니다.

# Make_1함수에서 단계값들 저장
result = [N]
# 단계
cnt = 0
# 1이 있을 때 까지 반복
while True:
    result = Make_1(result)
    cnt += 1
    if result.count(1== 1:
        break

여기서 주의할 점은 N이 1일 경우는  Make_1 함수를 사용할 필요가 없으니 예외처리를 해주어야 합니다.

 

전체 코드

# 백준 1463 / 1로 만들기
def Make_1(N):
    lst = []
    for i in N:
        # 규칙 3
        lst.append(i - 1)
        # 규칙 1
        if i % 3 == 0:
            lst.append(i // 3)
        # 규칙 2
        if i % 2 == 0:
            lst.append(i // 2)
    # 중복 제거 후 리턴
    return list(set(lst))
 
if __name__=='__main__':
    # 입력 받기
    N = int(input())
 
    # 초기값 설정
    result = [N]
    cnt = 0
 
    # 1이 있을 때 까지 반복
    while True:
        # N이 1일 경우는 할 필요 없음
        if N == 1:
            break
        result = Make_1(result)
        cnt += 1
        if result.count(1== 1:
            break
    # 출력
    print(cnt)

반응형

'알고리즘 > 백준' 카테고리의 다른 글

[python/2156]포도주 시식  (0) 2020.04.27
[python/10844]쉬운 계단 수  (0) 2020.04.23
[python/2579]계단 오르기  (0) 2020.04.18
[python/1932]정수 삼각형  (0) 2020.04.16
[python/1149]RGB거리  (0) 2020.04.14