[백준] 12014번 주식 (C++)

2025. 9. 9. 18:44·Algorithm
728x90

https://www.acmicpc.net/problem/12014

 

 

이 문제는 N일과 주식을 사야하는 K일이 존재한다.

이후 N일만큼 그날의 주가가 주어졌을때 일수가 지남에 따라 주식이 증가하는 날을 부분적으로 선택하여 K일 이상으로 살 수 있는경우 1을 출력 못할 경우 0을 출력하는 문제이다.

 

문제를보면 굉장히 비슷한 문제들을 풀었던 기억이 떠오를 것이다 https://www.acmicpc.net/problem/11053 과 비슷하다고 생각할 수 있을 것이다.

 

따라서 dp를 사용하여 그 중 최댓값을 기록하여 그 최댓값이 K보다 작은지 이상인지 비교하여 출력해주었다.

 

이때 배열의 최대 길이는 1만이다 결국 부분수열의 시간복잡도는 O(N^2)이며 시간제한은 5초이기 때문에 통과할 수 있다고 생각하였다.

 하지만 T의 최대 크기가 100이기 때문에 불가능하지만 제출해보니 통과가 되었다....

 

 

정답코드

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
#define endl "\n"
#define MAX 1e9

struct coordinate {
    int x;
    int y;
    int r;
};

// int dx[] = {0, -1, 0, 1, 1, -1, -1, 1};
// int dy[] = {-1, 0, 1, 0, -1, 1, -1, 1};
int dx[] = {1, 1, 1};
int dy[] = {-1, 0, 1};
int T, N, M;
int arr[10001];
int dp[10001];
int cnt = 1;

void solve() {
    int tmp = 1;
    fill(dp, dp + N+1, 1);

    for(int i = 1; i < N; i++) {
        for(int j = 0; j < i; j++) {
            if(arr[i] > arr[j]) {
                dp[i] = max(dp[j]+1, dp[i]);
            }
            tmp = max(dp[i], tmp);
        }
    }

    if(tmp >= M) {
        cout << 1 << endl;
    }
    else cout << 0 << endl;
}

void input() {
    cin >> T;

    while(T--) {
        cin >> N >> M;

        cout << "Case #" << cnt << endl;

        for(int i = 0; i < N; i++) {
            cin >> arr[i];
        }

        solve();
        cnt++;
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    input();
}

 

solve 함수를 살펴보면

void solve() {
    int tmp = 1;
    fill(dp, dp + N+1, 1);

    for(int i = 1; i < N; i++) {
        for(int j = 0; j < i; j++) {
            if(arr[i] > arr[j]) {
                dp[i] = max(dp[j]+1, dp[i]);
            }
            tmp = max(dp[i], tmp);
        }
    }

    if(tmp >= M) {
        cout << 1 << endl;
    }
    else cout << 0 << endl;
}

 

입력받은 배열과 dp 배열이 존재한다 첫번째로 dp배열을 1씩 다 초기화 해주었다. 그 이유는 증가하는 부분수열 특성상 자기 자신을 선택하는 경우는 모든 경우에서 다 가능하기 때문에 1로 초기화 한 이후

배열을 순차적으로 순회할때 현재 지점 이전을 끝까지 순회하며 선택한 지점보다 큰 경우는 증가할 수 있기 때문에 가능한 최댓값으로 update하였다.

 

이후 최대 일수와 K를 비교하여 1 또는 0을 출력해주었다.

728x90
저작자표시 (새창열림)

'Algorithm' 카테고리의 다른 글

[백준] 1812번 사탕 (C++)  (0) 2025.09.11
[백준] 13116번 30번 (C++)  (0) 2025.09.10
[백준] 23305번 수강변경 (C++)  (0) 2025.09.08
[백준] 16472번 고냥이 (C++)  (0) 2025.09.07
[백준] 19622번 회의실 배정 3 (C++)  (0) 2025.09.06
'Algorithm' 카테고리의 다른 글
  • [백준] 1812번 사탕 (C++)
  • [백준] 13116번 30번 (C++)
  • [백준] 23305번 수강변경 (C++)
  • [백준] 16472번 고냥이 (C++)
쿨쿨.
쿨쿨.
  • 쿨쿨.
    All of the life
    쿨쿨.
  • 전체
    오늘
    어제
    • 분류 전체보기 (284) N
      • Programming (51) N
        • C, C++ (18)
        • Python (6)
        • Java (1)
        • HTML,CSS,JS (3)
        • SQL(DB) (13)
        • SpringBoot (7) N
        • Android (2)
        • CI,CD (1)
      • Algorithm (173)
        • Review (4)
      • Security (14)
        • WebHacking (3)
        • Websecurity (11)
      • OS (19)
        • Linux (12)
        • Mac os (2)
      • 머신러닝 (1)
      • CS(Computer Science) (12)
        • 컴퓨터 네트워크 (3)
        • 컴퓨터 구조 (1)
        • 인공지능 (8)
      • Docker (2) N
      • Dev Book Review (3)
        • Clean Code (1)
        • Effective Java (0)
        • Real MySQL (2)
      • SWM (1)
      • Review (6)
      • AWS (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    투포인터
    DP
    우선순위큐
    정렬
    c언어
    DFS
    그리디
    이분탐색
    비트마스킹
    그래프 이론
    다익스트라
    BFS
    트리
    다이나믹 프로그래밍
    브루트포스
    wargame
    깊이우선탐색
    코딩
    WebSecurity
    우선순위 큐
    누적합
    재귀
    백준
    에라토스테네스의 체
    Leviathan
    Bandit
    시뮬레이션
    구현
    linux
    백트래킹
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.6
쿨쿨.
[백준] 12014번 주식 (C++)
상단으로

티스토리툴바