코딩 테스트

[코딩테스트 1일차] PCCE 기출문제 3번, 5번, 7번

sunlight-dby 2025. 3. 31. 23:15

[PCCE 기출문제 3번 / 수 나누기]

[문제]

2자리 이상의 정수 number가 주어집니다. 주어진 코드는 이 수를 2자리씩 자른 뒤, 자른 수를 모두 더해서 그 합을 출력하는 코드입니다.
코드가 올바르게 작동하도록 한 줄을 수정해 주세요.

 

[제한사항]

  • 10 <= number <= 2,000,000,000
    • number의 자릿수는 2의 배수입니다.

 

[입출력 예]

입력 #1 : 4859

출력 #1 : 107

 

입력 #2 : 29

출력 #2 : 29

 

[solutio.cpp]

#include <iostream>

using namespace std;

int main(void) {
    int number;
    cin >> number;

    int answer = 0;

    for(int i=0; i<1; i++){
        answer += number % 100;
        number /= 100; if (number != 0) { --i; }
    }
    cout << answer << endl;
    return 0;
}

 

[고찰]

처음 정답을 제출했던 코드입니다.

한 줄을 수정해야한다고 하지만, 수정할 부분이 보이지 않아 코드를 추가하였습니다.

하지만, 다른 사람들의 풀이를 보며 이 얼마나 한심한 생각이었는지를 깨달았습니다.

동시에 제가 코딩 테스트를 얼마나 등한시했었는지도 말입니다...

코드가 말하는 바가 무엇인지를 정확히 파악하지 못하였던 것이 큰 오점이었던 것 같습니다.

결국 해당 코드의 핵심은 answer가 정확하게 나오기 위해서는 number가 0이 되어야하는데,

이를 코드의 핵심으로 생각한 것이 아니라, 그저 결과값이 제대로 나오기 위해서만 if 구문을 추가하였습니다.

코드의 핵심을 생각하며 간결하게 수정을 했어야 했는데, 그러지 못했던 것입니다.

이 문제를 통해 앞으로는 코드의 핵심을 생각하며 간결하게 수정을 하는 것에 대해 계속 생각해야겠습니다.

 

[수정된 solution.cpp]

#include <iostream>

using namespace std;

int main(void) {
    int number;
    cin >> number;

    int answer = 0;

    while(number){
        answer += number % 100;
        number /= 100;
    }
    cout << answer << endl;
    return 0;
}

[PCCE 기출문제 5번 / 심폐소생술]

[문제]

심폐소생술은 다음과 같은 순서를 통해 실시합니다.

  1. 심정지 및 무호흡 확인 [check]
  2. 도움 및 119 신고 요청 [call]
  3. 가슴압박 30회 시행 [pressure]
  4. 인공호흡 2회 시행 [respiration]
  5. 가슴압박, 인공호흡 반복 [repeat]

주어진 solution 함수는 심폐소생술을 하는 방법의 순서가 담긴 문자열들이 무작위 순서로 담긴 리스트 cpr이 주어질 때 각각의 방법이 몇 번째 단계인지 순서대로 담아 return하는 함수입니다. solution 함수가 올바르게 작동하도록 빈칸을 채워 solution 함수를 완성해 주세요.

 

[solution.cpp]

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<string> cpr) {
    vector<int> answer = { 0, 0, 0, 0, 0 };
    vector<string> basic_order = { "check", "call", "pressure", "respiration", "repeat" };

    for (int i = 0; i <cpr.size(); i++) {
        for (int j = 0; j <    basic_order.size(); j++) {
            if (cpr[i] == basic_order[j]) {
                answer[i] = j;
                break;
            }
        }
    }

    return answer;
}

 

[고찰]

해당 문제는 vector의 사이즈를 아는 방법을 알면 쉽게 풀 수 있는 문제입니다.

다른 사람의 풀이를 보고, static_cast를 사용한 방법이 인상이 깊어 추가로 정리하였습니다.

 

[정리]

"vector의 사이즈를 아는 방법"

vector.size()

size(vector)

static_cast<int>(vector.size());
// 벡터의 사이즈는 항상 size_type으로 반환되기 때문에, 정수형으로 직접 사용하는 경우를 고려해
// 타입의 형 변환에 있어서 오류를 체크해주려고 static_cast<int> 사용

 


 

[PCCE 기출문제 7번 / 버스]

[문제]

영진이는 약속장소에 가기 위해 버스를 타려고 합니다. 버스에는 좌석이 총 seat개만큼 있습니다. 영진이는 버스 좌석에 앉아서 갈 수 있을지 궁금해합니다. 기점에서 출발한 버스가 영진이가 기다리는 정거장에 도착하기 전에 방문하는 각 정거장에서 승/하차한 승객 정보가 주어질 때, 영진이가 버스에 탄 순간 빈 좌석은 몇 개인지 구해주세요.
영진이가 기다리는 정거장에서는 영진이가 제일 먼저 버스에 탑승하며, 이전 정거장에서 버스에 탑승한 승객들은 남는 좌석이 있다면 항상 앉는다고 가정합니다. 또, 기점에서 출발하는 버스에는 승객이 0명 타고 있습니다.

 

예를 들어 다음은 좌석이 5개인 버스에 각 정거장에서 승/하차한 승객 정보를 나타냅니다. 영진이는 4번 정거장에서 기다리고 있으며, "On"은 승차한 승객, "Off"는 하차한 승객을 의미합니다.

- 1번 정거장 : ["On", "On", "On"]   (3명 승차, 0명 하차)
- 2번 정거장 : ["Off",  "On",  "-"]     (1명 승차, 1명 하차)
- 3번 정거장 : ["Off",  "-",     "-"]      (0명 승차, 1명 하차)

 

위와 같은 경우, 4번 정거장에서는 영진이가 가장 먼저 탑승하므로, 남아있는 좌석 수는 3개입니다.

 

주어진 solution 함수는 버스의 좌석 개수 seat, 기점에서 출발한 버스가 순서대로 방문한 정거장에서 승객이 승/하차한 정보를 담은 2차원 문자열 리스트 passengers가 주어질 때, 버스에 남아있는 좌석의 개수를 return하는 함수입니다. solution 함수가 올바르게 작동하도록 빈칸을 채워 solution 함수를 완성해 주세요.

 

[solution.cpp]

#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]);  // func 뒤 빈칸 위치
        num_passenger -= func3(passengers[i]);  // func 뒤 빈칸 위치
    }
    int answer = func1(seat - num_passenger);   // func 뒤 빈칸 위치
    return answer;
}

 

 

[고찰]

해당 문제는 2차원 배열의 행과 열만 생각하면 어렵지 않은 문제입니다.

그럼에도 정리하는 이유는, 정적 배열일 때와 동적 배열일 때의 차이를 개인적으로 정리해놓기 위해서입니다.

 

뿐만 아니라, 빈칸 문제가 아닌 완전 구현 문제라고 생각했을 때,
어떻게 구현해야 가장 적합한지를 생각하기 위해서도 정리하였습니다.

 

[정리]

  • 정적 배열
    • 정적 배열의 크기를 구하기 위해서는 sizeof 연산자를 활용한다.
    • 행은 arr[n], 열은 arr[n][n]으로써 알 수 있다.
  • 동적 배열
    • 동적 배열의 크기를 구하기 위해서는 vector의 크기를 구하는 연산자인 size 연산자를 활용한다.
    • 행은 arr, 열은 arr[n]으로써 알고 있다.
      • arr[n] : n번째 행의 열