728x90
반응형

재귀함수 10

[Baekjoon 9095 / Python / 실버3] 1, 2, 3 더하기

import sysinput = sys.stdin.readlineN = int(input())def plus(num):    if num == 1:        return 1    elif num == 2:        return 2    elif num == 3:        return 4    else:        return plus(num-1) + plus(num-2) + plus(num-3)for _ in range(N):    print(plus(int(input()))) 재귀 방식( 바람직하지 않음 ) DP문제다. 두가지 방식으로 풀어보았다. 하나는 재귀 방식, 하나는 DP테이블을 사용하는 방식.이해를 하긴 했으나 뭔가 와닿지가 않는다. 아 이런거구나~ 하고 이해해놓고 잠시 뒤에, 근..

[크래프톤 정글 5기] 스택, 레지스터, 꼬리 재귀 최적화

스택(stack) - 프로시저 호출 시 “지역 변수와 매개변수”를 저장하기 위한 메모리 공간(지역변수 = 로컬변수) - 후입선출(LIFO, Last In First Out) 구조 스택의 용도 - 함수의 로컬 변수 저장 : 각 함수 호출 시, 그 함수의 로컬 변수들이 스택에 저장된다. - 함수의 제어 흐름 관리 : 함수가 다른 함수를 호출할 때, 반환 주소와 이전 함수의 스택 프레임 정보가 스택에 저장된다. - 장점 : 동적으로 메모리 할당/해제 가능, 구현이 간단함, 메모리 관리 overhead가 낮음 스택의 특징 - 스택에서 데이터가 삽입되고 빠져나가는 쪽을 top 이라고 한다. 반대쪽은 bottom이다. - %rsp 레지스터는 스택 포인터이다. 스택 포인터는 항상 스택의 top 주소를 가리키고 있다...

[Baekjoon 1992 / python / 실버1] 쿼드트리

n = int(input()) # 변의 길이 board = [list(map(int, input().rstrip())) for _ in range(n)] # rstrip() 하면 개행문자 제거해서 한번에 입력할 수 있게 해준다 def quadTree(x, y, n): # x, y좌표와 변 길이를 입력받는다, 첫 호출은 0,0을 입력 color = board[x][y] for i in range(x, x+n): for j in range(y, y+n): # 현재 사각형의 모든 칸을 검사한다 if color != board[i][j]: # 색깔이 다른 칸이 하나라도 있다면 4등분 재귀호출 한다 print('(', end='') # 출력 양식에 맞게 괄호 입력 quadTree(x, y, n//2) # 출력 양..

[Baekjoon 1182 / python / 실버2] 부분수열의 합

n, s = map(int, input().split()) # 숫자의 개수, 목표 숫자 numList = list(map(int, input().split())) # 숫자 리스트 number = [] # 계산에 사용할 리스트 cnt = 0 # 경우의 수 저장할 변수 def back(start): # 시작 인덱스 입력받기 global cnt if sum(number) == s and len(number) > 0: # 합이 s와 같고, 원소가 1개 이상일 때 ( 공집합 제외 해야 하니까 ) cnt += 1 # 찾았으니 경우의 수 + 1 for i in range(start, len(numList)): # 입력받은 인덱스부터, numList의 끝까지 진행한다 number.append(numList[i]) # ..

[Baekjoon 2630 / python / 실버2] 색종이 만들기

import sys n = int(sys.stdin.readline()) # 종이 길이 paper = [list(map(int, sys.stdin.readline().split())) for _ in range(n)] # 종이와 색깔 result = [] # 결과를 담을 변수 def cut(x, y, n): # 행, 열 시작지점과 종이 길이를 입력받는다 color = paper[x][y] # 종이 색깔 비교를 위한 색깔 저장 for i in range(x, x + n): for j in range(y, y + n): if color != paper[i][j]: # 다른 색깔이 존재할 경우 종이를 4등분한다 cut(x, y, n//2) cut(x+n//2, y, n//2) cut(x, y+n//2, n//..

[Baekjoon 15649 / python / 실버3] N과 M(1)

def dfs(graph, selected, m): # 숫자목록, 현재선택된숫자리스트, 모을 숫자의 개수 if len(selected) == m: # 선택된 숫자가 m개면 출력 print(*selected) # ex) [1, 2, 3] -> 1 2 3 이렇게 출력됨 return # 출력을 했으면 상위 노드로 돌아가 다른 경우의 수 찾음 for i in range(1, len(graph)): # 1부터 n까지 탐색 if not visited[i]: # 방문 안했었다면 값 추가, 이 숫자를 점유한다는 느낌 visited[i] = True # 숫자는 중복되면 안 되니까, 하위 노드에서 이 숫자를 쓰지 않도록 True로 해둔다(점유한다) selected.append(i) dfs(graph, selected, m..

Algorithm/DFS 2024.03.24

[Baekjoon 9663 / python / 골드4] N-Queen

n = int(input()) pos = [0] * n # 퀸 위치 담을 리스트 flag_heng = [False] * n # 행 배제 flag_a = [False] * ((n-1) * 2 + 1) # 우상향 대각 배제 flag_b = [False] * ((n-1) * 2 + 1) # 좌상향 대각 배제 count = 0 # 경우의 수 def set(i): global count for j in range(n): if not flag_heng[j] and not flag_a[i + j] and not flag_b[(n-1) + i - j]: # 행 , 대각, 대각 안전할 때 pos[i] = j # i번째 열의 j번째 행에 퀸을 둔다 if i == n - 1: # 마지막 열까지 n개의 퀸을 뒀을 때, 즉 경..

[크래프톤 정글 5기] week01 알고리즘 주차 두번째 날, Big-O, 시간/공간 복잡도

리처드 파인만 공부법- 무언가를 간단하게 설명할 수 없다면, 그것을 제대로 이해하고 있는 것이 아니다- 어린이도 이해할 수 있을 만큼 쉽고 평이한 언어로 설명할 수 있도록 공부해야 함-> 어려운 단어, 문장을 그대로 외우는 게 아닌, 원리를 이해하여 간단히 설명할 수 있도록 연습 알고리즘 평가는 수행 시간/메모리 사용량에 기준을 둔다.시간 복잡도(Time Complexity)- 수행 시간에 해당함- 특정 크기의 입력을 기준으로, “필요한 연산의 횟수” 공간 복잡도(Space Complexity)- 메모리 사용량- 프로그램 실행/완료에 “필요한 메모리 공간” 시간 복잡도와 공간 복잡도는 “반비례”하는 경향이 있다.ex) 실행시간을 줄이면 메모리를 많이 쓰고, 메모리를 적게 쓰면 실행시간이 늘어나고...실제..

[Baekjoon 1914 / python / 실버1] 하노이 탑

n = int(input())def hanoi(no, start, end, mid): # no번 원반을 start에서 end로 옮긴다    if no == 1: # 원반이 1개라면 위에 방해되는 원반이 없으니 즉시 옮긴다        print(start, end)        return        else:        hanoi(no-1, start, mid, end) # 2개 이상이면 위에 방해되는 원반을 치운다         print(start, end) # 방해되는거 치웠으니 원래 옮기려던거 목표자리에 옮긴다        hanoi(no-1, mid, end, start) # 치워둔것도 목표자리에 옮긴다if n 20:    print(2 ** n - 1) # 최소횟수 출력    hanoi..

Algorithm/Recursion 2024.03.23

[Baekjoon 10872 / python / 브론즈3] 팩토리얼

def factorial(n): if n > 0: return n * (factorial(n - 1)) else: return 1 n = int(input()) print(factorial(n)) 팩토리얼은 n! 으로 표기하며, 1부터 n까지의 수를 곱하면 된다. 팩토리얼은 재귀함수로 표현할 수 있으며, 재귀함수는 자기 자신과 똑같은 함수를 호출하는 함수이다. 물론 팩토리얼의 구현은 재귀함수로 하지 않는 게 더 효율적이지만, 팩토리얼이 재귀함수를 호출할 때 사용되는 대표적인 예이기 때문에 재귀함수로 구현하였다.

Algorithm/Recursion 2024.03.22
728x90
반응형