본문 바로가기

문제풀이13

[백준] 11053 - 가장 긴 증가하는 부분 수열 (C++) 문제 출처: www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 문제 풀이: 필자가 생각하기에 이 문제의 핵심은 증가수열의 첫 부분 정하기 뒷부분에서 만들어지는 증가 수열이 기존에 만들어진 증가수열의 일부분(중복되는 부분) 인지 체크 때문에 cache 자료구조를 만들어서 방문한 자리를 체크해주었다. 이렇게 해주어도 괜찮은 이유는 예제를 보면서 알아보자 arr 10 20 10 30 20.. 2021. 3. 26.
[백준] 11727 - 2xn 타일링2 (Python) 문제 출처: www.acmicpc.net/problem/11727 11727번: 2×n 타일링 2 2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다. www.acmicpc.net 문제 풀이: 앞서 본 2xn 타일링 과 매우 흡사한 문제이다. 이문제의 경우 기존에 문제에 2x2타일이 생긴 경우이다. 정답을 듣기전에는 사고하기가 어려울 수 있는데 간단하게 생각하면 기존 2xn 타일링 문제의 점화식을 그대로 가져오되, 2x2 짜리 타일은 1x2짜리 타일 2개를 이은거와 같은 형태이므로 2x2 타일을 쓸 경우와, 1x2짜리 타일을 쓸 경우를 따로 샌다고 생각해보면 두가지다 결국 dp[n-2] 가 된다. 따라서 .. 2021. 3. 17.
[백준] 11726 - 2xn타일링 (Python) 문제 출처 : www.acmicpc.net/problem/11726 11726번: 2×n 타일링 2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다. www.acmicpc.net 문제 풀이 : 문제를 읽어보면 DP의 냄새가 물씬 난다. DP의 핵심은 (나도 아직 잘 못하지만) 남에게 미루기 라고 생각한다. 이 문제에서는 놓을 수 있는 블록이 2x1 이랑 1x2 짜리 2개이다. 그러면 점화식을 다음과 같이 놓을때, dp[n] = 1xn 에 타일을 놓을 수 있는 방법의 수 이런 경우에 우리는 맨마지막에 2x1을 넣을지 1x2를 넣을지 생각해 볼 수 있다. 즉 우리는 dp[n] 에 대해서 dp[n].. 2021. 3. 17.
[백준] 10451 - 순열 사이클 (Python) 문제 출처 : www.acmicpc.net/problem/10451 10451번: 순열 사이클 1부터 N까지 정수 N개로 이루어진 순열을 나타내는 방법은 여러 가지가 있다. 예를 들어, 8개의 수로 이루어진 순열 (3, 2, 7, 8, 1, 4, 5, 6)을 배열을 이용해 표현하면 \(\begin{pmatrix} 1 & 2 &3&4&5&6&7&8 \\ 3 www.acmicpc.net 문제 풀이 : DFS로 풀면 각 cycle이 나올때마다 방문 표시를 해주고, 전체 (모든 노드를 통과하는) 반복문에서는 방문 표시가 있을때는 DFS를 하지 않도록 한다면 추가로 cycle을 구분해 주지 않아도 각 싸이클에서만 ans을 더해줄 수 있다. 이 문제는 cycle이 정확하기 때문에 (어디서 시작하고 어디서 끝날지 우.. 2021. 3. 12.
반응형