
1주차의 긴장감을 14주차까지 꾸준히 가져가보자
dp[1] = 1
dp[2] = 2
dp[3] = 4 : 1111 12 21 3
dp[4] = 7 : 1111 112 121 211 22 13 31
dp[5] = 13 : 11111 113 131 311 ...
자세히 보면 N ≥ 4 일경우 dp[N] = dp[N - 1] + dp[N -2] + dp[N -3] 이고,
결국 이를 활용해서
import sys
input = sys.stdin.readline
T = int(input())
num_list = [int(input().strip()) for _ in range(T)]
dp = [0] * 1000 # Increased size to be safe for larger numbers
dp[0] = 0
dp[1] = 1
dp[2] = 2
dp[3] = 4
max_num = max(num_list)
# 4부터 입력받은 수중 가장 큰수까지 dp 실행
for i in range(4, max_num + 1):
dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3]
# 리스트의 수의 dp 값을 출력
for nums in num_list:
print(dp[nums])
으로 풀어야 했다.
# 구해야할 것 : 사이클의 길이
import sys
input = sys.stdin.readline
# 1. 입력받기
N = input().rstrip()
int_N = int(N)
count = 0
# 2. 사이클 함수
# 계속 재귀로 돌리면서 일치할때까지 실행, 실행하며 Count += 1
# 종료조건 = 결과값이 int_N과 동일할때
def plus_cycle(num):
global count
# 들어오는 입력갑이 10보다 작을 경우 0 집어넣기
if int(num) < 10:
num = str(num)
num ='0' + num
# 입력값을 리스트로 형변환
num_digits = list(num)
# 각 자릿수 더하기
result = int(num_digits[0]) + int(num_digits[1])
# 더한 결괏값이 10보다 작을 경우 0 집어넣기
if result < 10:
result = str(result) #'8'
result = '0' + result #'08'
# 결괏값 자릿수 활용위해 문자열로 형변환
result = str(result)
# 더하기 사이클 적용된 결과값
new_num = int(num_digits[1] + result[1])
# 더하기 사이클 적용된 값이 처음 입력값과 같은지 확인
if new_num == int_N:
count += 1
return
else:
count += 1
plus_cycle(str(new_num))
# 함수 실행
plus_cycle(N)
print(count)
import sys
input = sys.stdin.readline
N = int(input())
count = 0
def plus_cycle(num):
global count
ten_digit = num // 10 # 10의 자릿수 (2)
first_digit = num % 10 # 1의 자릿수 (6)
# 6 * 10 + (2 + 6) => 68
new_num = (first_digit) * 10 + (ten_digit + first_digit) % 10
count += 1
# print(new_num)
if new_num == N:
return
else:
plus_cycle(new_num)
plus_cycle(N)
print(count)
핵심이 되는 키 아이디어는 N이 입력받아오는 두자리 수 일때,
N // 10 # 10의 자릿수 => 2
N % 10 # 1의 자릿수 => 6
이렇게 10의 자리와 1의 자리를 뽑아 낼 수 있었다는 것...
한줄 요약하자면 한쪽으로만 데이터 넣고 데이터를 뽑는 것.
그러다보니 자연스럽게 늦게 넣은 것을 먼저 뺄 수 밖에 없다
push ⇒ Append 연산 사용(리스트의 가장 뒤쪽에 원소 추가)
L = [0, 1, 2]
L.append(2, 10)
print(L) # [0, 1, 10, 2]
pop
L = [0, 1, 2, 3]
L.pop()
print(L) # [0, 1, 2]
L.pop(1) # 1번째 원소 리턴 후 삭제
print(L) # [0, 2]인덱스를 반환**첫 요소** 반환첫 Index 반환그 값을 반환하는지, 인덱스를 반환하는지 잘 살펴보고 맞는 상황에 적절한 함수를 쓰는 것이 중요!
JS 도 같이 하니까 파이썬 메서드랑 헷갈리기 시작한다.
for in 이 둘다 있는데, 요소를 순회하는 것과 인덱스를 순회하는 것으로 다르게 쓰여서
계속 JS 코드에 for in 써서 틀리는 경우가 좀 있다...
조금만 신경써서 코드를 작성해봅시다...!