재귀 9

[백준 알고리즘] 16987번: 계란으로 계란치기 (Python / 파이썬)

문제 링크 16987번: 계란으로 계란치기 원래 프로그래머의 기본 소양은 팔굽혀펴기를 단 한 개도 할 수 없는 것이라고 하지만 인범이는 3대 500을 넘기는 몇 안되는 프로그래머 중 한 명이다. 인범이는 BOJ에서 틀린 제출을 할 때마다 턱 www.acmicpc.net 문제 접근 치는 계란과 맞는 계란을 잘 다뤄야 한다. 치는 계란은 항상 왼쪽 첫 번째 계란이고, 이 계란이 깨지면 다음 계란이 치는 계란이 된다. 재귀를 하면서 배열 자체에서 깨진 계란을 삭제해 버리면 복잡해지므로 알고리즘 내에서 조건으로 깨짐 여부를 체크하고 그에 따라 처리해준다. 정답 코드 # 16987번: 계란으로 계란치기 import sys def count(eggs): cnt = 0 for i in eggs: if i[0]

알고리즘/백준 2024.01.28

[백준 알고리즘] N과 M (12) (Python / 파이썬)

문제 링크 15666번: N과 M (12) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해 www.acmicpc.net 문제 접근 set과 정렬을 이용해서 중복된 수가 없는 오름차순을 만들어주고 순서대로 함수를 호출하고 내부적으로 재귀호출한다. 정답 코드 # 15666번: N과 M (12) import sys def func(select): if len(select) == m: print(*select) return for j in range(len(a)): if a[j] >= select[-1]: select.append(a[j]) func(select) selec..

카테고리 없음 2024.01.28

[백준 알고리즘] N과 M (11) (Python / 파이썬)

문제 링크 15665번: N과 M (11) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해 www.acmicpc.net 문제 접근 set과 정렬을 해준 뒤 순서대로 함수를 실행해주고 내부적으로 재귀호출을 한다. 정답 코드 # 15665번: N과 M(11) import sys def func(select): if len(select) == m: print(*select) return for i in range(len(a)): select.append(a[i]) func(select) select.pop() n, m = map(int, sys.stdin.readline(..

알고리즘/백준 2024.01.28

[백준 알고리즘] 1759번: 암호 만들기 (Python / 파이썬)

문제 링크 1759번: 암호 만들기 첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다. www.acmicpc.net 문제 접근 재귀함수를 만들어 해결하였다. 암호의 길이가 L이고 알파벳순으로 암호가 나와야 하기 때문에, 문자가 C개 주어진다면 문자열을 순회하며 인덱스가 L-C+1인 것까지 탐색하며 재귀함수를 호출한다. L = 4, C = 6 a t c i s w 다음과 같이 주어진다면 먼저 이것을 정렬하여 알파벳순으로 만들면 a c i s t w 정렬된 상태에서 0 ~ L-C+1 인덱스를 탐색하면 a 또는 c 또는 i 로 시작하는 알파벳순의 문자열만을 만들 수 있다. (..

알고리즘/백준 2024.01.25

[백준 알고리즘] 6603번: 로또 (Python / 파이썬)

문제 링크 6603번: 로또 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로 www.acmicpc.net 정답 코드 # 6603번: 로또 import sys def func(select): if len(select) == 6: print(*select) return for i in range(1, len(s)): if s[i] not in select and select[-1]

알고리즘/백준 2024.01.24

[백준 알고리즘] 1182번: 부분수열의 합 (Python / 파이썬)

정답 코드 #1182번: 부분수열의 합 import sys def find(pointer, total): global answer if pointer >= n: return find(pointer + 1, total) # 토탈에 현재 값이 반영되지 않음 total += a[pointer] find(pointer + 1, total) # 토탈에 현재 값 반영 if total == s: answer += 1 n, s = map(int, sys.stdin.readline().split()) a = list(map(int, sys.stdin.readline().split())) answer = 0 find(0, 0) print(answer) 1182번: 부분수열의 합 첫째 줄에 정수의 개수를 나타내는 N과 정수..

알고리즘/백준 2024.01.24

[백준 알고리즘] 15649번: N과 M(1) (Python / 파이썬)

정답 코드 #15649번: N과 M(1) import sys def find_sequence(select): if len(select) == m: print(*select) for i in range(1, n+1): if i not in select: select.append(i) find_sequence(select) select.pop() return n, m = map(int, sys.stdin.readline().split()) find_sequence([]) 15649번: N과 M (1) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해 www.acmicpc...

알고리즘/백준 2024.01.24

[백준 알고리즘] 1780번: 종이의 개수 (Python / 파이썬)

문제 접근 n x n 행렬을 받아, 안의 모든 요소가 같다면 그대로 리턴, 같지 않다면 행과 열을 절반으로 나누어 9개의 행렬로 분할하여 각각 재귀호출한다. 재귀함수를 하나 만들었고, 각 영역이 몇 개씩인지 세야 하므로 count[]라는 배열을 만들어 영역이 1로 채워진 경우 count[1]에, 영역이 0으로 채워진 경우 count[0]에, -1로 채워진 경우 count[-1]에 더해지도록 했다. 가장 중요한 부분은 행렬을 9개로 분할하는 것인데, 파이썬의 slicing을 사용했다. 현재 행(열) 사이즈를 1/3로 나누어 new_size에 할당하고 이를 이용해 3*3 for loop를 돌며 새로 만들(분할된) 행렬의 범위를 슬라이싱으로 정해주었다. 정답 풀이 #1780번: 종이의 개수 import sys..

알고리즘/백준 2024.01.22

[백준 알고리즘] 2630번: 색종이 만들기 (Python / 파이썬)

문제 접근 n x n 행렬을 받아, 안의 모든 요소가 같다면 그대로 리턴, 같지 않다면 행과 열을 절반으로 나누어 4개의 행렬로 분할하여 각각 재귀호출한다. 재귀함수를 하나 만들었고, 하얀 색종이와 파란 색종이 영역이 각 몇 개씩인지 세야 하므로 count[]라는 배열을 만들어 영역이 1로 채워진 경우 count[1]에, 영역이 0으로 채워진 경우 count[0]에 더해지도록 했다. 가장 중요한 부분은 행렬을 4개로 분할하는 것인데, 파이썬의 slicing을 사용했다. 현재 행(열) 사이즈를 절반으로 나누어 new_size에 할당하고 이를 이용해 2*2 for loop를 돌며 새로 만들(분할된) 행렬의 범위를 슬라이싱으로 정해주었다. 정답 코드 #2630: 색종이 만들기 import sys def cou..

알고리즘/백준 2024.01.22