[week01/03.20]TIL

CHO WanGi·2025년 3월 20일

KRAFTON JUNGLE 8th

목록 보기
8/89

하루 한줄 요약

1주차의 긴장감을 14주차까지 꾸준히 가져가보자

오늘 공부한 내용

  • 백준(9095,1110)
  • 스택 자료구조
  • JS (indexOf vs find vs findIndex)

새로 배우게 된 내용

백준 9095

  • DP
    이코테 책에서 분명히 DP 개념을 배웠는데, 정글 들어와서 하얗게 잊어버렸다
    DP는 점화식을 찾고, 그 점화식에 맞추어서 큰 문제를 작은 문제 여러개로 나누어 푸는 것
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])

으로 풀어야 했다.

백준 1110

  • 일단 노가다로 깎은 내방식
# 구해야할 것 : 사이클의 길이
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)
  • 10의 자리수와 1의 자리수의 관계를 이용한 깔끔한 방식
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의 자리를 뽑아 낼 수 있었다는 것...

스택 자료구조

한줄 요약하자면 한쪽으로만 데이터 넣고 데이터를 뽑는 것.
그러다보니 자연스럽게 늦게 넣은 것을 먼저 뺄 수 밖에 없다

연산(List 자료구조 사용)

  1. push ⇒ Append 연산 사용(리스트의 가장 뒤쪽에 원소 추가)

    L = [0, 1, 2]
    L.append(2, 10)
    
    print(L) # [0, 1, 10, 2]
  2. pop

  • 스택의 pop 처럼 마지막 요소를 빼내려면 인자로 아무것도 넘겨주지 않아야 함.
    L = [0, 1, 2, 3]
    L.pop()
    print(L)  # [0, 1, 2]
    
    L.pop(1)  # 1번째 원소 리턴 후 삭제
    print(L)  # [0, 2]

JS : indexOf vs find vs findIndex

1. indexOf

  • 배열에서 특정 요소의 인덱스를 반환
  • 반환타입은 number(숫자형). 없다면 -1.

2. find

  • 판별 함수를 만족하는 **첫 요소** 반환
  • 원하는 요소를 찾으면, 검색을 중단하고 해당 요소를 반환
  • 반환 타입은 찾은 요소의 찾은 요소의 타입. 없다면 undefined.

3. findIndex

  • 판별 함수를 만족하는 첫 Index 반환
  • 원하는 요소를 찾자마자 메서드를 종료함)
  • 반환타입은 number(숫자형). 없다면 -1.

그 값을 반환하는지, 인덱스를 반환하는지 잘 살펴보고 맞는 상황에 적절한 함수를 쓰는 것이 중요!

공부하면서 어려웠던 점

JS 도 같이 하니까 파이썬 메서드랑 헷갈리기 시작한다.
for in 이 둘다 있는데, 요소를 순회하는 것과 인덱스를 순회하는 것으로 다르게 쓰여서
계속 JS 코드에 for in 써서 틀리는 경우가 좀 있다...
조금만 신경써서 코드를 작성해봅시다...!

profile
제 Velog에 오신 모든 분들이 작더라도 인사이트를 얻어가셨으면 좋겠습니다 :)

0개의 댓글