코딩테스트 140

[동적계획법] 파도반 수열

문제 오른쪽 그림과 같이 삼각형이 나선 모양으로 놓여져 있다. 첫 삼각형은 정삼각형으로 변의 길이는 1이다. 그 다음에는 다음과 같은 과정으로 정삼각형을 계속 추가한다. 나선에서 가장 긴 변의 길이를 k라 했을 때, 그 변에 길이가 k인 정삼각형을 추가한다. 파도반 수열 P(N)은 나선에 있는 정삼각형의 변의 길이이다. P(1)부터 P(10)까지 첫 10개 숫자는 1, 1, 1, 2, 2, 3, 4, 5, 7, 9이다. N이 주어졌을 때, P(N)을 구하는 프로그램을 작성하시오. 입력 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, N이 주어진다. (1 ≤ N ≤ 100) (첫째 줄에 있는 것은 테스트 테이스의 개수이다.!) https://st-lab.tist..

[동적 계획법] 01타일

문제 지원이에게 2진 수열을 가르쳐 주기 위해, 지원이 아버지는 그에게 타일들을 선물해주셨다. 그리고 이 각각의 타일들은 0 또는 1이 쓰여 있는 낱장의 타일들이다. 어느 날 짓궂은 동주가 지원이의 공부를 방해하기 위해 0이 쓰여진 낱장의 타일들을 붙여서 한 쌍으로 이루어진 00 타일들을 만들었다. 결국 현재 1 하나만으로 이루어진 타일 또는 0타일을 두 개 붙인 한 쌍의 00타일들만이 남게 되었다. 그러므로 지원이는 타일로 더 이상 크기가 N인 모든 2진 수열을 만들 수 없게 되었다. 예를 들어, N=1일 때 1만 만들 수 있고, N=2일 때는 00, 11을 만들 수 있다. (01, 10은 만들 수 없게 되었다.) 또한 N=4일 때는 0011, 0000, 1001, 1100, 1111 등 총 5개의 2..

[동적계획법] 신나는 함수 실행

문제 재귀 호출만 생각하면 신이 난다! 아닌가요? 다음과 같은 재귀함수 w(a, b, c)가 있다. if a 20, then w(a, b, c) returns: w(20, 20, 20) if a < b and b < c, then w(a, b, c) returns: w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c) otherwise it returns: w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1) 위의 함수를 구현하는 것은 매우 쉽다. 하지만, 그대로 구현하면 값을 구하는데 매우 오랜 시간이 걸린다. (예를 들면, a=15, b=15, c=15) a, b, c가 주어졌을 때, w(a, b, c)를 출력..

[동적 계획법] 알고리즘 수업 - 피보나치 수 1

동적 계획법, Dynamic Programing 은 DP라고도 한다. 큰 문제를 작은 문제로 쪼개서 해결한 뒤 그 결과들로 부터 큰 문제의 정답을 얻는 알고리즘이다. 작은문제로 쪼개서 해결한다고 하지 않았는가? 이는 저장해야한다는 뜻이다. 나중에 다시 써야할 때가 있다. 바로 이 점이 분할정복과의 차이점이다. 분할정복은 휘발이 가능하다. 예를 들어 피보나치를 생각해보자. f(10) = f(9)+f(8) f(9) = f(8)+f(7) .... 여기서 f(8)을 저장해야한다. DP는 구현방법의 차이로 두가지로 나눌 수 있다. 1. Top down : 재귀 // 대부분의 코드에서 사용 2. Bottom up : 반복문 // 리소스 이점 존재 이제 문제를 풀어보자. 문제 오늘도 서준이는 동적 프로그래밍 수업 조..

[백트래킹] N과 M(4)

문제 자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. 1부터 N까지 자연수 중에서 M개를 고른 수열 같은 수를 여러 번 골라도 된다. 고른 수열은 비내림차순이어야 한다. 길이가 K인 수열 A가 A1 ≤ A2 ≤ ... ≤ AK-1 ≤ AK를 만족하면, 비내림차순이라고 한다. 비 내림차순. 배열을 출력할 때, 11, 12 이런 건 가능, 근데 21 32 이런건 안된다는 것 어떻게 해결해야할까? 1. if문으로 arr[i-1] 이 arr[i] 보다 큰 경우는 그냥 return 하게 만들면 되지 않을까? import java.util.*; import java.io.*; public class Main{ public static int[] arr; ..

[백트래킹] N과 M(3)

문제 자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. 1부터 N까지 자연수 중에서 M개를 고른 수열 같은 수를 여러 번 골라도 된다. 이 문제는 그냥 다! 나올 수 있는 모든 것을 출력하는 문제이다. 즉 중복도 괜찮다는 뜻이다! 1) 1 ~ N 까지의 수를 조합한다. 2) M 개를 선택하여 조합한다. (길이(깊이)가 M이다) 3) 중복해서 조합 할 수 있다. https://st-lab.tistory.com/116 [백준] 15651번 : N과 M (3) - JAVA [자바] www.acmicpc.net/problem/15651 15651번: N과 M (3) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하..

[백트래킹] N과 M(2)

문제 자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열 고른 수열은 오름차순이어야 한다. 입력 첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8) 출력 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해야 한다. N과 M문제(1) 에서 오름차순 조건이 하나 추가된 문제인듯 4 4에서 1 2 3 4 만 가능하다. import java.util.*; import java.io.*; public class Main{ public static in..

[백트래킹] N과 M(1)

문제 자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열 입력 첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8) 문제를 풀기에 앞서, 백트래킹이란 무엇일까? 백트래킹은 DFS와 유사하다고 말할 수 있다. 또한 사람이 사는 사고와 유사하다고 말할 수 있다. 경우의 수를 탐색할 때 어떤 경우의 수가 안되는게 뻔히 보이면 탐색을 안한다. -> 다른걸 탐색한다. 트리, 스토쿠 등이 이에 해당하는데, 단점은 시간 복잡도 계산이 어렵다는 것이다. 이런 문제는 어떻게 풀어야 하나... https://st-lab.tistory.com/114 [백준] 15649번 : N과 M (1) - J..

[브루트포스] 영화감독 숌

문제 666은 종말을 나타내는 수라고 한다. 따라서, 많은 블록버스터 영화에서는 666이 들어간 제목을 많이 사용한다. 영화감독 숌은 세상의 종말 이라는 시리즈 영화의 감독이다. 조지 루카스는 스타워즈를 만들 때, 스타워즈 1, 스타워즈 2, 스타워즈 3, 스타워즈 4, 스타워즈 5, 스타워즈 6과 같이 이름을 지었고, 피터 잭슨은 반지의 제왕을 만들 때, 반지의 제왕 1, 반지의 제왕 2, 반지의 제왕 3과 같이 영화 제목을 지었다. 하지만 숌은 자신이 조지 루카스와 피터 잭슨을 뛰어넘는다는 것을 보여주기 위해서 영화 제목을 좀 다르게 만들기로 했다. 종말의 수란 어떤 수에 6이 적어도 3개 이상 연속으로 들어가는 수를 말한다. 제일 작은 종말의 수는 666이고, 그 다음으로 큰 수는 1666, 266..

[브루트포스] 덩치

문제 우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x, y)로 표시된다. 두 사람 A 와 B의 덩치가 각각 (x, y), (p, q)라고 할 때 x > p 그리고 y > q 이라면 우리는 A의 덩치가 B의 덩치보다 "더 크다"고 말한다. 예를 들어 어떤 A, B 두 사람의 덩치가 각각 (56, 177), (45, 165) 라고 한다면 A의 덩치가 B보다 큰 셈이 된다. 그런데 서로 다른 덩치끼리 크기를 정할 수 없는 경우도 있다. 예를 들어 두 사람 C와 D의 덩치가 각각 (45, 181), (55, 173)이라면 몸무게는 D가 C보다 더 무겁고, 키는 C가 더 크므로, "덩치"로만 볼..