[백준 알고리즘] 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..
[백준 알고리즘] 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(..
[백준 알고리즘] 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 로 시작하는 알파벳순의 문자열만을 만들 수 있다. (..
[백준 알고리즘] 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]
[백준 알고리즘] 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과 정수..
[백준 알고리즘] 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...
[백준 알고리즘] 7569번: 토마토 (Python / 파이썬)
·
알고리즘/백준
문제 접근 [백준 알고리즘] 7576번: 토마토 (Python / 파이썬) 문제 접근 헷갈렸던 문제이다. bfs를 사용하는데 시작 지점이 여러개다. 단순히 queue 사이클이 몇번 돌아갔는지 체크하면 당연히 더 큰 값이 나와 틀릴 것이기 때문에 한 사이클에 몇개의 요소가 gyujh.tistory.com 이전에 풀었던 7576번 토마토 문제의 3차원 버전이다. 이때 풀었던 방법과 다르게, 큐에 새로운 익은 토마토를 넣을 때 그 값에 이전 토마토 값 + 1 을 할당하여 날짜 계산을 더 쉽게 처리했다. 주의할 점으로는 시작점이 되는 토마토들이 1의 값을 가지고 있으므로, 위처럼 날짜 계산을 한다면 이 시작 값들은 0이 되거나 마지막에 최댓값을 구하고 1을 빼줘야 한다. 1의 의미는 하루가 지났음의 의미인데 ..
[백준 알고리즘] 2206번: 벽 부수고 이동하기 (Python / 파이썬)
·
알고리즘/백준
문제 접근 최단 경로를 구하는 문제이므로 bfs가 적합하다. n * m 행렬이 주어지고, 시작점이 정해져 있기에 생각보다 간단한 문제라고 생각했다. 벽(1)을 한 번만 부술 수 있으므로, 모든 벽들을 하나씩 부숴보고 bfs를 각각 돌려 최솟값을 구하면 된다고 생각했지만, n , m
[백준 알고리즘] 10026번: 적록색약 (Python / 파이썬)
·
알고리즘/백준
문제 접근 deepcopy로 matrix를 하나 복사해서 색약용은 G -> R를 같은 문자로 만들어준다. 각각 순회하며 일반용은 값이 R, G, B일 때, 색약용은 R, B일 때 bfs를 호출한다. bfs 안에서는 방문한 곳을 X로 바꿔주고 탐색이 끝나고 1을 리턴한다. bfs가 실행된 횟수를 카운트하면 영역의 수가 된다. 정답 코드 # 10026번: 적록색약 import sys import copy from collections import deque def bfs(matrix, x, y, color): queue = deque() queue.append((x, y)) matrix[x][y] = 'X' dx, dy = [1, 0, 0, -1], [0, 1, -1, 0] while queue: cur =..
[백준 알고리즘] 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..