백준 100

[백준/BOJ] 11066 - 파일 합치기

11066 - 파일 합치기 문제 소설가인 김대전은 소설을 여러 장(chapter)으로 나누어 쓰는데, 각 장은 각각 다른 파일에 저장하곤 한다. 소설의 모든 장을 쓰고 나서는 각 장이 쓰여진 파일을 합쳐서 최종적으로 소설의 완성본이 들어있는 한 개의 파일을 만든다. 이 과정에서 두 개의 파일을 합쳐서 하나의 임시파일을 만들고, 이 임시파일이나 원래의 파일을 계속 두 개씩 합쳐서 소설의 여러 장들이 연속이 되도록 파일을 합쳐나가고, 최종적으로는 하나의 파일로 합친다. 두 개의 파일을 합칠 때 필요한 비용(시간 등)이 두 파일 크기의 합이라고 가정할 때, 최종적인 한 개의 파일을 완성하는데 필요한 비용의 총 합을 계산하시오. 예를 들어, C1, C2, C3, C4가 연속적인 네 개의 장을 수록하고 있는 파일..

[백준/BOJ] 10451 - 순열 사이클

10451 - 순열 사이클 문제 1부터 N까지 정수 N개로 이루어진 순열을 나타내는 방법은 여러 가지가 있다. 예를 들어, 8개의 수로 이루어진 순열 (3, 2, 7, 8, 1, 4, 5, 6)을 배열을 이용해 표현하면 아래와 같다. 또는, Figure 1과 같이 방향 그래프로 나타낼 수도 있다. 순열을 배열을 이용해 아래처럼 나타냈다면, i에서 πi로 간선을 이어 그래프로 만들 수 있다. Figure 1에 나와있는 것 처럼, 순열 그래프 (3, 2, 7, 8, 1, 4, 5, 6) 에는 총 3개의 사이클이 있다. 이러한 사이클을 "순열 사이클" 이라고 한다. N개의 정수로 이루어진 순열이 주어졌을 때, 순열 사이클의 개수를 구하는 프로그램을 작성하시오. 코드 from collections import ..

[백준/BOJ] 11725 - 트리의 부모 찾기

11725 - 트리의 부모 찾기 문제 루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오. 코드 def dfs(x, p, visited): global result stack = [] stack.append((x, p)) visited[x] = True while stack: v, parent = stack.pop() result[v] = parent for i in graph[v]: if not visited[i]: stack.append((i, v)) visited[i] = True N = int(input()) graph = [[] for _ in range(N+1)] for i in range(N-1): a, b = map(int,..

[백준/BOJ] 3055 - 탈출

3055 - 탈출 문제 사악한 암흑의 군주 이민혁은 드디어 마법 구슬을 손에 넣었고, 그 능력을 실험해보기 위해 근처의 티떱숲에 홍수를 일으키려고 한다. 이 숲에는 고슴도치가 한 마리 살고 있다. 고슴도치는 제일 친한 친구인 비버의 굴로 가능한 빨리 도망가 홍수를 피하려고 한다. 티떱숲의 지도는 R행 C열로 이루어져 있다. 비어있는 곳은 '.'로 표시되어 있고, 물이 차있는 지역은 '*', 돌은 'X'로 표시되어 있다. 비버의 굴은 'D'로, 고슴도치의 위치는 'S'로 나타내어져 있다. 매 분마다 고슴도치는 현재 있는 칸과 인접한 네 칸 중 하나로 이동할 수 있다. (위, 아래, 오른쪽, 왼쪽) 물도 매 분마다 비어있는 칸으로 확장한다. 물이 있는 칸과 인접해있는 비어있는 칸(적어도 한 변을 공유)은 물..

[백준/BOJ] 1737 - Pibonacci

1737 - Pibonacci 문제 피보나치(Fibonacci) 수열은 매우 유명한 수열로 그 점화식은 F[i]=F[i-1]+F[i-2]와 같이 표현된다. 우리는 이와 같은 수열을 살짝 변경한 피보나치(Pibonacci) 수열에 대해 살펴보자. 피보나치 수열의 점화식은 아래와 같다. P[n] = 1 (0 ≤ n ≤ π) P[n] = P[n-1] + P[n-π] (그 외) 주의할 것은 n이 꼭 정수일 필요는 없다는 것이다. 즉, P[n-π] = P[n-π-1]+P[n-π-π]와 같은 식으로 계산을 해 주어야 한다. 자연수로 n이 주어졌을 때, P[n]을 구하는 프로그램을 작성하시오. 코드 import math import sys sys.setrecursionlimit(10**6) def pibonacci(..

[백준/BOJ] 1793 - 타일링

1793 - 타일링 문제 2×n 직사각형을 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다. 코드 while True: try: N = int(input()) dp = [1, 1, 3] for i in range(3, N+1): dp.append(dp[i-1] + 2 * dp[i-2]) print(dp[N]) except: break 한마디 다이나믹 프로그래밍의 가장 기본적인 유형인 타일링 문제이다. i-1 까지 타일이 채워져 있다면 그 다음에 올 타일은 2 X 1짜리 긴 타일 하나뿐이다. 반면 i-2 까지 타일이 채워져 있다면 2 X 2짜리 타일 한 개 혹은 1 X 2짜리 타일 두 개가 올 수 있기 때문에 위와 같이 점화식을 ..