프로그래머스

피로도 - 프로그래머스, c++

2023. 2. 3. 16:25

 

 

- 문제 풀이

"완전 탐색"을 사용해 푸는 문제였다.

완전 탐색 중에서도 이 문제는 단순 Brute-Fore 방법이나 순열로 해결할 수 도 있고 BFS를 구현해 해결할 수 도 있는 문제였다.

나는 전자의 방법을 선택했다.

 

 

- 코드

처음에 내가 작성하여 제출한 코드는 다음과 같다.

하지만 결과는 논리 오류(?)와 같은 결과가 나왔다.

논리적인 오류를 해결해야 했다.

"signal: segmentation fault (core dumped)"

#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;

int solution(int k, vector<vector<int>> dungeons) {
    int answer = -1;
    
    
    //0부터 dungeons.size()-1까지의 수로 만들 수 있는 모든 수 조합을 vector에 저장
    int n = 1;
    vector<int> num(dungeons.size());  
    for(int i=0; i<dungeons.size(); i++) {
        num.push_back(i);
        n *= (i+1);
    }
    
    vector<vector<int>> temp(n,vector <int>(dungeons.size(),0));  
    int n1 = 0;
    do{
        for(int i=0; i<num.size(); i++) {
            temp[n1].push_back(num[i]);
        }
        n1++;
    }
    while(next_permutation(num.begin(), num.end()));
    
    
    // num에 저장한 숫자대로 dungeons에 접근해 최대로 갈 수 있는 던전 수를 계산하기
    for(int i=0; i<temp.size(); i++) {
        int count = 0;
        int sum = k;
        
        for(int j=0; j<num.size(); j++) {
            if(sum<=dungeons[temp[i][j]][0]) {
                sum -= dungeons[temp[i][j]][1];
                count++;
            }
            else {
                break;
            }
        }
        
        if(answer<count)
            answer = count;
    }
    
    
    return answer;
}

 

 

이를 해결하기 위해서는 다음과 같은 것들을 수정했다.

나는 1차원 벡터를 만들어 문제를 해결하려고만 했는데 그냥 2차원 벡터 dungeons를 그대로 사용하는 방식이 더 간단했다.

1. 2차원 벡터 dungeons를 바로 사용하기 위해 인덱스 [0], 가장 앞에 있는 수를 기준으로 정렬을 먼저 해주었다.

2. do{} 부분에서 바로 dungeons 벡터의 값을 가져와 k값을 계산할 수 있다.

3. answer과 count값을 비교할 때는 max() 함수를 통해 더 간단하게 구현할 수 있다.

3. dungeons는 2차원 벡터임에도 next_permutation(dungeons.begin(), dungeons.end()) 를 하면 인덱스 [0]의 가장 앞에 있는 수를 기준으로 모든 조합의 순열을 만들어 준다.

굳이 내가 짠 코드처럼 1차원 벡터만 순열 함수에 넣을 수 있는 건 아니다.

최종 코드는 다음과 같다.

#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;

int solution(int k, vector<vector<int>> dungeons) {
    int answer = -1;
    
    
    //2차원 벡터를 sort하면 [0]에 담긴 수의 오름차순으로 정렬됨
    sort(dungeons.begin(), dungeons.end());
    
    
    //모든 조합의 숫자대로 탐색하기
    do{
        // num에 저장한 숫자대로 dungeons에 접근해 최대로 갈 수 있는 던전 수를 계산하기
        int count = 0;
        int k_sum = k;
        for(const auto& dungeon: dungeons) {
            if(k_sum >= dungeon[0]){
                k_sum -= dungeon[1];
                count++;
            }
            else {
                break;
            }
        }
        answer = max(count, answer);
    }
    while(next_permutation(dungeons.begin(), dungeons.end()));
    

    return answer;
}

 

 

단순 탐색과 순열을 사용하는 방법말고 BFS를 구현해 해결하는 방법도 있다.

BFS만 구현하면 코드적으로 더 간단해 보이긴 한다. 

BFS를 통한 구현은 링크를 참고해 공부했다.

(https://imnotabear.tistory.com/569)

1. 최소 피로도를 [] 배열 만들기

2. 소모 피로도를 [] 배열 만들기

3. isvisited [] 배열을 만들어 던전 탐험 유무를 확인하기

4. dfs()를 수행하며 남은 피로도가 최소 피로도 이상이며, 탐험하지 않은 던전인 경우, 탐험하기

5. dfs() 실행하며 count한 값을 반환하기

 

 

 

 

 

'프로그래머스' 카테고리의 다른 글

- 프로그래머스, c++  (0) 2023.02.05
모음사전 - 프로그래머스, c++  (0) 2023.02.04
카펫 - 프로그래머스, c++  (0) 2023.02.02
더 맵게 - 프로그래머스, c++  (0) 2023.02.01
소수 찾기 - 프로그래머스, c++  (0) 2023.01.31