문제수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.입력첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다.둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000) 출력첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다. 접근 방식 가장 긴 증가하는 부분 수열 문제와 같지만 조건이 다르다N이 1000에서 1,000,000으로 바뀌어서 기존에 N제곱이 걸리는 코드로 푼다면 시간초과가 뜬다 따라서 이분탐색과 함께 lo..
Algorithm
문제수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.입력첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)출력첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다. 접근 방식 아주 유명한 DP 문제이다dp 배열을 생성하는데 dp[i]를 i번째 요소를 마지막으로 하는 증가하는 부분 수열의 최대 길이로 정의한다 즉, dp 배열을 모두 1로 초기화 한다음이중 반복문을 통해i를 1..
문제어떤 숫자가 줄어들지 않는다는 것은 그 숫자의 각 자리 수보다 그 왼쪽 자리 수가 작거나 같을 때 이다.예를 들어, 1234는 줄어들지 않는다. 줄어들지 않는 4자리 수를 예를 들어 보면 0011, 1111, 1112, 1122, 2223이 있다. 줄어들지 않는 4자리수는 총 715개가 있다.이 문제에서는 숫자의 앞에 0(leading zero)이 있어도 된다. 0000, 0001, 0002는 올바른 줄어들지 않는 4자리수이다.n이 주어졌을 때, 줄어들지 않는 n자리 수의 개수를 구하는 프로그램을 작성하시오.입력첫째 줄에 테스트 케이스의 개수 T(1 출력각 테스트 케이스에 대해 한 줄에 하나씩 줄어들지 않는 n자리 수의 개수를 출력한다. 접근 방식 dp[i][j] : i자리 숫자에서 첫 번째 숫자가 ..
문제nCm을 출력한다.입력 n과 m이 주어진다. (5 ≤ n ≤ 100, 5 ≤ m ≤ 100, m ≤ n)출력nCm을 출력한다. 접근 방식 조합 자체를 구하는 것은 쉽다하지만 100C100일 경우long long 의 범위를 넘어가기 때문에 큰 수 구하기 방식으로 풀어야 한다 찾아보다가 나는 배열 자체를 vector 형식으로 풀이하는 방식으로 풀었다.typedef로 vector를 BigInt 형으로 선언한 후,기존에 풀던 대로 dp 배열을 BigInt 형으로 선언해 사용해주면 된다. 코드 자체는 복잡했지만알고보면 원래 조합을 구하는 dp 코드 그 자체임을 알 수 있다 코드 #includeusing namespace std;typedef vector BigInt;BigInt dp[103][103];BigI..
문제정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.X가 3으로 나누어 떨어지면, 3으로 나눈다.X가 2로 나누어 떨어지면, 2로 나눈다.1을 뺀다.정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.입력첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.출력첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다. 접근 방식 다양한 방식으로 풀이할 수 있겠지만,N -> 1이 아닌 1 -> N을 만드는 방식으로 풀이 하였다 따라서 dp 배열을 1은 0, 2와3은 각각 1로 초기화하고나머지 값들은 모두 최댓값인 자신의 값으로 초기화해주었다 그리고 다시 반복문을 돌면서 3의 배수인지 2의 배수인지 확인 ..
문제파스칼 삼각형은 아래와 같은 모양으로 이루어져 있다. 양 끝을 제외한 각 수는 자신의 바로 왼쪽 위의 수와 바로 오른쪽 위의 수의 합으로 되어있다.이때 R번째 줄, C번째 수를 위 꼭짓점으로 하는 한 변이 포함하는 수의 개수가 W인 정삼각형과 그 내부를 생각하자. 정삼각형의 변과 그 내부에 있는 수들의 합을 구하고 싶다. 예를 들면, 3번 째 줄, 1번 째 수를 꼭짓점으로 하고 한 변이 포함하는 수의 개수가 4인 정삼각형과 그 내부에 있는 수의 합은 1+(1+3)+(1+4+6)+(1+5+10+10) = 42 이다.주어진 R, C, W에 대해서 그에 해당하는 합을 구하는 프로그램을 작성하여라.입력첫째 줄에 양의 정수 R, C, W가 공백을 한 칸씩 두고 차례로 주어진다. (단, 2 ≤ R+W ≤ 30,..
문제피카츄는 "pi", "ka", "chu"를 발음할 수 있다. 따라서, 피카츄는 이 세 음절을 합친 단어만 발음할 수 있다. 예를 들면, "pikapi"와 "pikachu"가 있다.문자열 S가 주어졌을 때, 피카츄가 발음할 수 있는 문자열인지 아닌지 구하는 프로그램을 작성하시오. 입력첫째 줄에 문자열 S가 주어진다. 문자열은 알파벳 소문자로 이루어진 문자열이며, 길이는 5000을 넘지 않는다.출력문자열 S가 "pi", "ka", "chu"를 이어 붙여서 만들 수 있으면 "YES"를 아니면 "NO"를 출력한다. 접근 방식처음에는 pi, ka, chu를 문자열에서 제거하는 방식으로 코드를 작성하였다즉, erase를 사용해 문자를 제거하였지만 틀렸습니다라고 떴다 따라서 굳이 문자열을 삭제하지 않고도현재 인덱..
문제문자열 s가 있을 때, f(s)는 s를 무한번 붙인 문자열로 정의한다. 예를 들어, s = "abc" 인 경우에 f(s) = "abcabcabcabc..."가 된다.다른 문자열 s와 t가 있을 때, f(s)와 f(t)가 같은 문자열인 경우가 있다. 예를 들어서, s = "abc", t = "abcabc"인 경우에 f(s)와 f(t)는 같은 문자열을 만든다.s와 t가 주어졌을 때, f(s)와 f(t)가 같은 문자열을 만드는지 아닌지 구하는 프로그램을 작성하시오.입력첫째 줄에 s, 둘째 줄에 t가 주어진다. 두 문자열 s와 t의 길이는 50보다 작거나 같은 자연수이고, 알파벳 소문자로만 이루어져 있다. 출력첫째 줄에 f(s)와 f(t)가 같으면 1을, 다르면 0을 출력한다. 접근 방식 예시는 ab, ..