본문 바로가기

C++105

[C++] 백준 12015번 : 가장 긴 증가하는 부분 수열2 https://www.acmicpc.net/problem/12015 12015번: 가장 긴 증가하는 부분 수열 2 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000) www.acmicpc.net 문제 풀이 이전 문제와 다른 점은 input의 개수이다. 따라서 이 문제의 핵심은 시간 복잡도를 줄이는 것이다. 이전 문제에서는 i - 1 회의 반복횟수로 시간 복잡도가 O(N^2)가 된다. 하지만 백만개의 인풋에 대해서 1초라는 시간 내로 연산을 끝낼 수가 없어 다른 방법으로 시도해야 한다. 이중 탐색문으로 lower bound를 찾는 방법을 이용하면 시간 복잡도가 O(N log N)이 된다. .. 2021. 6. 21.
[C++] 백준 11053번 : 가장 긴 증가하는 부분 수열 https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 문제 접근 배열 arr은 입력받은 값을 저장하는 배열이고 DP는 특정 값이 최대 위치인 길이를 저장한다. 입력받은 값들을 비교하는데 변수 idx는 arr[i]의 값이 위치할 수 있는 인덱스 넘버를 저장한다. 두 값을 비교하고 타겟(arr[i])이 더 크다면 위치값을 올려준다. 여기서 MAX 함수로 기존 idx 값과, D.. 2021. 6. 21.
[C++] 백준 2156번 : 포도주 시식 https://www.acmicpc.net/problem/2156 2156번: 포도주 시식 효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규 www.acmicpc.net 문제 풀이 이전에 계단 오르기와 비슷한 문제. 차이점은 마지막을 포함하는지 안 하는지이다. 따라서 단순하게 3회 연속만 따지면 된다. 첫 잔에서 최대는 당연히 첫 잔이다. 둘째 잔까지도 두 잔의 합이 최대이다. 세 번째부터 약간 달라지는데 연속 3번이 안되기 때문에 최대는 1번 + 2번 or 1번 + 3번 or 2번 + 3번이다. 배열 DP는 n번째 잔까지의 최댓값을 저장하고 glasses는 n번째.. 2021. 6. 18.
[C++] 백준 10844번 : 쉬운 계단 수 https://www.acmicpc.net/problem/10844 10844번: 쉬운 계단 수 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net 문제 접근 계단 수는 마지막에 오는 숫자에 따라서 다음에 올 수 있는 숫자가 정해져 있다. 예를 들어서 0 뒤에는 무조건 1, 9 뒤에는 무조건 8이 와야 한다. 그 외에 숫자들은 +1 값과 -1 값이 올 수 있다. (ex. 2 → 1 or 3) 배열 DP는 숫자의 길이와 마지막 수를 인덱스로 가지고 해당 숫자의 길이의 마지막 숫자에 대한 경우의 수를 저장한다. DP [2][3]은 즉, 길이가 2인 숫자의 마지막 숫자가 3의 경우의 수를 저장하고 있다. DP[i][j]를 점화식으로 표현하면 j가 0이면, DP[.. 2021. 6. 18.
[C++] 백준 1463번 : 1로 만들기 https://www.acmicpc.net/problem/1463 1463번: 1로 만들기 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. www.acmicpc.net 문제 접근 배열 DP는 연산횟수가 저장된 배열이다. 함수는 3으로 나누었을 때, 2로 나누었을 때, 1을 뺏을 때 세 가지 경우를 따졌을 때 가장 적은 연산횟수를 저장하고 반환한다. 느낀점 처음 작성한 코드가 문제가 있었는데 생각보다 간단하게 이해가 되지 않았었다. 최초의 코드는 모든 경우를 따지지 않고 경우를 나누었기 때문에 최소 연산 횟수를 정확하게 반환하지 못했다. int solution(int n) { if (n == 1 || n == 0) return 0; if (dp[n] == 0) { if (n %.. 2021. 6. 18.
[C++] 백준 2579번 : 계단 오르기 https://www.acmicpc.net/problem/2579 2579번: 계단 오르기 계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. 과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점 www.acmicpc.net 문제 풀이 문제에서 마지막 계단은 무조건 밟아야 한다는 조건을 주었다. 그렇다면 주어진 경우는 1. 마지막 계단의 전 계단을 밟는 경우 2. 마지막 계단의 전전 계단을 밟는 경우 dp 배열은 n번째 계단에서 나올 수 있는 최댓값을 저장한다. 그렇다면 점화식은 주어진 경우에 따라 1번 경우 → N번째 계단 + (N-1)번째 계단 + (N-3)번째 계단까지의 최댓값 2번 경우 → N번째 계단 + (N-2)번째 계.. 2021. 6. 3.