본문 바로가기

알고리즘/프로그래머스

프로그래머스 - [PCCE 기출문제] 7번 / 버스 C++

SMALL

오늘은 이전 포스팅 2024.11.14 - [알고리즘/프로그래머스] - 프로그래머스 - [PCCE 기출문제] 6번 / 물 부족 C++

에 이어 7번 문제를 풀어보았다. 이때까지 풀었던 PCCE 기출문제 시리즈 중 가장 문제가 길었다. 보통 이런 문제의 경우 문제를 다 이해하면 좋겠지만, 문제의 흐름만 파악하고 입출력 예시를 통해 이해하는 게 가장 좋다. 

 

알고리즘 난이도 및 시간 ( ※ 개인적인 의견 )

  • 난이도 : Level 1.5 ( ※ Min : 0, Max : 10 )
  • 풀이 시간 : 5분
  • 제출 횟수 : 1번 
  • 풀이 결과 : Pass

문제 설명

  영진이가 버스를 탑승할 때 남아있는 좌석이 몇 자리인지 정답을 구하는 문제다. 문제에 딱히 함정은 없다. 다만 우리가 버스를 생각해 보면 서서 타는 승객도 있기 때문에 혹시나 계산 시 남은 좌석을 -로 반환하는? 것에 대한 예외처리만 있으면 된다는 것만 생각하면 된다. 

출처 : 프로그래머스

 제한사항도 딱히 복잡한 사항은 없고, "-" 는 딱히 고려해도 되지 않아도 된다는 점만 캐치하면 된다.

출처 : 프로그래머스


 

문제풀이

 오늘 문제는 코드를 보면 함수가 너무 많이 존재해서 함수별 역할을 정리하고 어떻게 활용하는 게 정답인지 설명하는 식으로 풀이를 해보고자 한다.

  • func1 : num이라는 변수를 전달받아 num이 0보다 작으면 0을 반환하고 그 이외에는 num을 반환하는 함수다. 그러면 용도가 무엇일까? 생각을 해볼 때 음수의 값을 전달받으면 0으로 처리해 주는 함수라고 할 수 있다. 문제 설명에서 언급했던 남은 좌석이 -로 계산될 경우 예외처리 시 사용할 수 있는 함수로 보면 된다.
  • func2 : fun1과 반대로 num이 양수면 0을 반환하고, 음수면 그대로 반환하는 함수다. 혹시 on과 off를 반대로 생각하면 절댓값을 활용하여 fun1과 같이 활용할 수 있을 것 같다.
  • func3 : string Type의 vector를 전달받아, "off" 문자열 개수를 반환하는 함수다.
  • func4 : func3과 같은 인자를 전달받고, "on" 문자열 개수를 반환하는 함수다.
#include <string>
#include <vector>

using namespace std;

int func1(int num){
    if(0 > num){
        return 0;
    }
    else{
        return num;
    }
}

int func2(int num){
    if(num > 0){
        return 0;
    }
    else{
        return num;
    }
}

int func3(vector<string> station){
    int num = 0;
    for(int i=0; i<station.size(); i++){
        if(station[i] == "Off"){
            num += 1;
        }
    }
    return num;
}

int func4(vector<string> station){
    int num = 0;
    for(int i=0; i<station.size(); i++){
        if(station[i] == "On"){
            num += 1;
        }
    }
    return num;
}

int solution(int seat, vector<vector<string>> passengers) {
    int num_passenger = 0;
    for(int i=0; i<passengers.size(); i++){
        num_passenger += func 빈칸;
        num_passenger -= func 빈칸;
    }
    int answer = func 빈칸;
    return answer;
}

 

 해당 문제를 풀 수 방법은 "off"를 기준으로 문제를 푸는 방법과 "on"을 기준으로 문제를 푸는 방법이 있다. 나는 두 가지 방법 중 탑승자를 기준으로 계산했기 때문에 "on"을 기준으로 +하고 "off"를 기준으로 -하였다. 그렇기 때문에 배정된 좌석 - 탑승자수로 문제를 풀었기 때문에 아래와 같이 정답을 작성하였다. 

 

방법 1

#include <string>
#include <vector>

using namespace std;

int func1(int num){
    if(0 > num){
        return 0;
    }
    else{
        return num;
    }
}

int func2(int num){
    if(num > 0){
        return 0;
    }
    else{
        return num;
    }
}

int func3(vector<string> station){
    int num = 0;
    for(int i=0; i<station.size(); i++){
        if(station[i] == "Off"){
            num += 1;
        }
    }
    return num;
}

int func4(vector<string> station){
    int num = 0;
    for(int i=0; i<station.size(); i++){
        if(station[i] == "On"){
            num += 1;
        }
    }
    return num;
}

int solution(int seat, vector<vector<string>> passengers) {
    int num_passenger = 0;
    for(int i=0; i<passengers.size(); i++){
        num_passenger += func4(passengers[i]);
        num_passenger -= func3(passengers[i]);
    }
    int answer = func1(seat - num_passenger);
    return answer;
}

 

방법2

방법 1과 반대로 "off"를 기준으로 계산하는 방식이다. 이럴 경우 남아있는 승객이 -이기 때문에 역으로 seat + num_passenger로 계산하면 된다.

#include <string>
#include <vector>

using namespace std;

int func1(int num){
    if(0 > num){
        return 0;
    }
    else{
        return num;
    }
}

int func2(int num){
    if(num > 0){
        return 0;
    }
    else{
        return num;
    }
}

int func3(vector<string> station){
    int num = 0;
    for(int i=0; i<station.size(); i++){
        if(station[i] == "Off"){
            num += 1;
        }
    }
    return num;
}

int func4(vector<string> station){
    int num = 0;
    for(int i=0; i<station.size(); i++){
        if(station[i] == "On"){
            num += 1;
        }
    }
    return num;
}

int solution(int seat, vector<vector<string>> passengers) {
    int num_passenger = 0;
    for(int i=0; i<passengers.size(); i++){
        num_passenger += func3(passengers[i]);
        num_passenger -= func4(passengers[i]);
    }
    int answer = func1(seat + num_passenger);
    return answer;
}

결과

출처 : 프로그래머스

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/340201

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr