본문 바로가기

알고리즘/SW Expert Academy

[모의 SW 역량테스트] 1952. 수영장

반응형

[모의 SW 역량테스트] 수영장


1. 이해하기

  • 수영장에서 판매하고 있는 이용권은 4 종류이다.
    • 1일 이용권, 1달 이용권, 3달 이용권, 1년 이용권
  • 이용권의 요금과 각 달의 이용 계획이 주어질 때, 이용 가능한 가장 적은 비용을 찾는 문제.
  • 완전탐색 문제.

2. 구현하기

  • 해당 달이 되었을 때, 각 이용권을 이용할 때의 비용을 각각 구해본다. 그리고 이 때의 최소값을 구한다.

    int solve(int index, int sum) {
        if(index >= 12) return sum;
    
        int ret = MAX;
        ret = min(ret,solve(index+1,sum+fee[0]*plan[index]));
        ret = min(ret,solve(index+1,sum+fee[1]));
        ret = min(ret,solve(index+3,sum+fee[2]));
        ret = min(ret,solve(index+12,sum+fee[3]));
        return ret;
    }

3. 전체 코드

#include <iostream>
using namespace std;
const int MAX = 987654321;
int plan[12];
int fee[4];

int solve(int index, int sum) {
    if(index >= 12) return sum;

    int ret = MAX;
    ret = min(ret,solve(index+1,sum+fee[0]*plan[index]));
    ret = min(ret,solve(index+1,sum+fee[1]));
    ret = min(ret,solve(index+3,sum+fee[2]));
    ret = min(ret,solve(index+12,sum+fee[3]));
    return ret;
}

void input() {
    for(int i = 0; i < 4; i++) cin >> fee[i];
    for(int i = 0; i < 12; i++) cin >> plan[i];
}

int main() {
    int T;
    cin >> T;
    for(int t = 1; t <= T; t++) {
        input();
        cout << "#" << t << ' ' << solve(0,0) << '\n';
    }
    return 0;
}