SWExpertAcademy의 옥히의 OK!부동산(7812 / D5) 문제이다.
[ 문제풀이 ]
주어진 1 x N 크기의 땅에서, M원으로 연속으로 이어진 땅을 투자할 수 있는 방법을 구해야 하는 문제이다.
그럼 주어진 테스트케이스 중, 2번 케이스를 통해서 한번 알아보자.
[ 1 3 2 5 4 6 2 1 3 2 ] , M = 6 인 경우이다.
아직, 투자를 하나도 하지 않은 상태이므로 초기에 사용한 자금은 0원이 된다.
그리고 땅을 순차적으로 탐색하면서 투자했을 때, 소모되는 자금을 적어보면..
첫 번째 땅[1] = 1원
두 번째 땅[3] = 4원 (첫 번째 땅에서 1원을 소모 , 두 번쨰 땅에서 3원을 소모 = 4원 소모)
세 번째 땅[2] = 6원 (1 + 3 + 2)
지금보면, 1번땅 ~ 3번땅 까지 연속적으로 이어진 땅에 투자를 했더니, 6원이 딱 맞춰졌다.
즉 ! 6원을 모두 사용해서 투자할 수 있는 경우이다.
이어서 계속해보자.
네 번째 땅[5] = 11원(1 + 3 + 2)
이 경우에는, 우리에게 주어진 M원을 초과하는 상황이 발생한다. 즉 ! 이 경우에는 그 이후에 나오는 땅들을 연속적으로 탐색을 할 수가 없다. 왜냐하면 이미 M원을 초과해 버렸기 때문에 저 탐색해봤자, 절대로 M원으로 투자할 수 있는 방법이 존재하지 않기 때문이다.
따라서, 이 경우에는 기존에 선택했던 땅들 중에서 일부를 포기해주어야 한다.
그럼 어떤 일부를 포기해야할까 ?? 바로 "포기함으로써, 6원 이하가 될 때까지" 포기를 해 주어야 한다.
가장 처음에 선택했던 첫 번째 땅을 포기해보자.
그럼, 현재 11원에서 1원만큼을 돌려받는 상황이니, 10원이 된다. 하지만, 그럼에도 6원을 넘어버렸기 때문에, 그 다음 땅을 포기해보자. 그럼, 10원에서 3원만큼을 돌려받는 상황이니, 7원이 된다. 하지만 여전히 6원을 넘어버렸다.
세 번째 땅도 포기를 하면, 7원에서 2원을 빼니 5원이 된다. 즉 ! 네 번쨰 땅에 투자를 하기 위해서는, 기존에 투자를 했던, 1번, 2번, 3번 땅들을 포기해야 한다. 그럼 현재까지 투자한 금액은 5원이 된다.
다섯 번째 땅[4] = 9원(기존의 투자한 금액 5원 + 4원)
이 경우에도 또 넘어버리게 된다. 마찬가지로 이전에 투자했던 땅들을 포기해보자. 그럼 네번째 땅을 포기해버리면, 4원이 된다.
이런식으로, 투자를 진행해 나가면 된다.
정리를 해보면...
1. 1번 땅부터 N번 땅 까지 순차적으로 투자를 해 볼 것이다.
2. 그런데, "현재 땅에 투자를 함으로써 소비되는 금액이 M원보다 더 클 경우" 기존에 투자를 했었던 땅들 중 일부를
순차적으로 포기를 해주어야 한다.
3. 만약, 투자를 하는 도중 "투자한 금액 = M원" 인 경우가 발생하면, 투자할 수 있는 방법의 수++
[ 소스코드 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | #include <iostream> #include <cstring> #define endl "\n" #define MAX 10010 using namespace std; int N, M, Answer; int Arr[MAX]; void Initialize() { Answer = 0; } void Input() { cin >> N >> M; for (int i = 1; i <= N; i++) { cin >> Arr[i]; } } void Solution() { int First_land = 1; int Cost = 0; for (int i = 1; i <= N; i++) { Cost = Cost + Arr[i]; while (Cost > M) Cost = Cost - Arr[First_land++]; if (Cost == M) Answer++; } } void Solve() { int Tc; cin >> Tc; for (int T = 1; T <= Tc; T++) { Initialize(); Input(); Solution(); cout << "#" << T << " " << Answer << endl; } } int main(void) { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //freopen("Input.txt", "r", stdin); Solve(); return 0; } | cs |
'[ SWEA Code ] > # SWEA - ' 카테고리의 다른 글
[ SWEA 7534 ] 스택 장인 (C++) (0) | 2020.09.20 |
---|---|
[ SWEA 9092 ] 마라톤 (C++) (0) | 2020.09.14 |
[ SWEA 9843 ] 촛불 이벤트 (C++) (0) | 2020.09.01 |
[ SWEA 4740 ] 밍이의 블록 게임 (C++) (0) | 2020.08.29 |
[ SWEA 7730 ] 나무 깎는 홍준 (C++) (0) | 2020.08.27 |