정글 TIL 7 (01.18) "SSS급 회귀자의 특급 재귀 함수"

김동준·2024년 1월 18일

알고리즘

목록 보기
11/11
  • 제목은 큰 의미 없습니다. 그저 재귀 함수를 풀다가 생각난 제목입니다.

python 문법

range() 함수

  • 일정한 범위의 연속된 정수를 생성하는데 사용된다. 리스트나 튜플을 반환하지 않고, range 객체를 반환한다. 이 객체는 반복문이나 list() 함수를 통해 리스트로 변환할 수 있다. range(start, stop, step): start부터 stop-1까지 step 간격으로 숫자를 생성한다.
for i in range(3):
             print(type(i))

             
<class 'int'>
<class 'int'>
<class 'int'>
for i in range(0, 20, 2):
             print(i)

             
0
2
4
6
8
10
12
14
16
18
numbers = list(range(1, 11))
             
print(numbers)
             
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

packing, unpacking

  • 패킹은 인자로 받은 여러 개의 값을 하나의 객체로 합쳐서 받을 수 있도록 한다. 위치인자 패킹은 * 한개를 매개변수 앞에 붙임으로 사용한다. 위치인자로 보낸 모든 객체들을 하나의 객체로 관리해준다. 위치인자가 패킹하는 매개변수를 만나면 그 이후에 위치인자가 몇 개이던지, tuple로 하나의 객체가 되어서 관리된다.
  • 동일하게 키워드에 패킹은 ** 을 통해 작성할 수 있다. 키워드 인자는 패킹한 인자들을 키워드와 인자 쌍으로 이뤄진 딕셔너리로 관리한다.
func(1,2,3,4,5,6,'a','b')
(1, 2, 3, 4, 5, 6, 'a', 'b')
<class 'tuple'>
def keywordpacking(**kwargs):
    print(kwargs)
    print(type(kwargs))

    
keywordpacking(a=1, b=2, c=3)
{'a': 1, 'b': 2, 'c': 3}
<class 'dict'>
def print_family_name(*parents, **sibling):
    print("아버지 :", parents[0])
    print("어머니 :", parents[1])
    if sibling:
        print("호적 메이트..")
        for title, name in sibling.items():
            print('{} : {}'.format(title, name))

            
print_family_name("홍길동", '심사임당', 누나='김태희', 여동생='윤아')
아버지 : 홍길동
어머니 : 심사임당
호적 메이트..
누나 : 김태희
여동생 : 윤아

sys.stdin.readline()

sys.stdin.readline()은 반복문으로 여러줄을 입력받아야 할 때 사용한다. 한줄 단위로 입력받기 때문에, 개행문자가 입력받아진다.('3' 입력 -> '3\n' 저장) 변수 타입이 문자열 형태(str)로 저장된다.

import sys
a = sys.stdin.readline()
hi
print(a)
hi
print(len(a))
3

import sys
data = list(map(int, sys.stdin.readline().split()))
3 1 2 4
print(data)
[3, 1, 2, 4]
print(len(data))
4
임의의 개수의 정수 n줄을 입력받아 2차원 리스트에 저장할 때
import sys
data = []
n = int(sys.stdin.readline())
2
for i in range(n):
    data.append(list(map(int, sys.stdin.readline().split())))
import sys
n = int(sys.stdin.readline())
2
data = [sys.stdin.readline().strip() for i in range(n)]
안녕
나는 누굴까
print(data)
['안녕', '나는 누굴까']

strip() 함수

  • 문자열 맨 앞과 맨 끝의 공백문자를 제거한다.

백준 알고리즘 문제 풀이

1110 더하기 사이클

  • 0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 연산하는 문제. 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리수를 만든다. 그 이후 주어진 수의 오른쪽 자리수(1의 자리)와 주어진 수의 각 자리의 수를 더한 수의 오른쪽 자리의 수를 이어붙여서 새로운 수를 만든다. 이 방식은 n번만에 원래 수로 돌아온다. 이때 n을 구하시오

  • 풀이
    (v1.배열) 주어진 수 a는 문자열로 입력받는다. 원래 a와 연산 뒤의 num이 같아질 때까지 반복하며 횟수를 idx로 저장한다. 같아질 때의 idx의 값을 출력한다.
    (v2.수학) 두 자리 정수를 입력받았을 때, 10의 자리의 수는 해당 수를 10으로 나눈 몫이다. 1의 자리 수는 10으로 나눈 나머지이다. 이를 활용하여 더한 숫자를 구한다. 새로운 숫자는 기존의 숫자의 뒷(1의)자리에 10을 곱해 10의 자리로, 더한 숫자의 뒷(1의)자리는 1의 자리로 더하면 새로운 숫자가 만들어진다.

'''
BOJ 1110번 더하기 싸이클 개요
> 주어진 수 a는 문자열로 입력받는다.
> 원래 a와 연산 뒤의 num이 같아질 때까지 반복하며 횟수를 cycle로 저장한다.
> 같아질 때의 cycle의 값을 출력한다.
'''

a = input()             # 입력받은 수 a는 문자열
num = ""                # 빈 문자열 생성
cycle = 0               # 싸이클 횟수

def plus_digit(n : str) -> str:     # 한 자릿수일 때, "0"을 붙여 두 자릿수로 반환
    if len(n) == 1 :
        n = "0" + n
    return n

# 초기 1 싸이클
a = plus_digit(a)        
num = plus_digit(str(int(a[0]) + int(a[1])))    # 문자열-> 정수형 -> 연산 -> 문자열 
num = a[1] + num[1]                 # 처음 숫자의 오른쪽 자릿수 + 연산된 숫자의 오른쪽 자릿 수

# 2회 싸이클부터 연산
while a != num :                    # a과 num가 같지 않을때 반복
    num = plus_digit(num)
    sum_num = plus_digit(str(int(num[0]) + int(num[1])))
    num = num[1] + sum_num[1]
    cycle += 1

print(cycle+1)                      # 초기 싸이클인 1회를 더해준다
cur = num = int(input())
ten = cur // 10
one = cur % 10
cnt = 0

new = (ten + one) % 10
cur = one * 10 + new
cnt += 1

while cur != num:
    ten = cur // 10
    one = cur % 10
    new = (ten + one) % 10
    cur = one * 10 + new
    cnt += 1

print(cnt)

15649 N과 M(1)

  • 자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 문제

  • 풀이
    백트래킹을 통해 구한다.

import sys
input = sys.stdin.readline

def back_trk():
    if m == len(a):
        print(" ".join(map(str, a)))
        return
    
    for i in range(1, n + 1):
        if i not in a:
            a.append(i)
            print(a)
            back_trk()
            a.pop()

a = []
n, m = map(int, input().split())

back_trk()
profile
고민하고 고뇌하는 개발자 (점심, 저녁 메뉴를)

0개의 댓글