ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 체육복 c++
    Coding Test/programmers 2022. 9. 13. 20:45
    728x90

    문제 설명

    점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.

    전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.

    제한 사항

    • 전체 학생의 수는 2명 이상 30명 이하입니다.
    • 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
    • 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
    • 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
    • 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.

    입출력 예

    n lost reserve return
    5 [2, 4] [1, 3, 5] 5
    5 [2, 4] [3] 4
    3 [3] [1] 2

    풀이

    전역변수로 student 배열을 선언해서 도난당한 학생과 여벌의 체육복이 있는 학생을 체크합니다.

    1. student 배열에 도난당한 학생은 -1, 여벌의 체육복이 있는 학생은 1로 표시합니다.

    2. student 배열의 원소가 -1이라면 앞,뒤 원소가 1인지 확인합니다.

    3. 도난당한 학생이 체육복을 빌렸다면, 도난당한 학생과 빌려준 학생 둘 다 0으로 변경합니다.

    3. student배열의 원소가 0이면 체육 수업에 들을 수 있습니다.

    #include <string>
    #include <vector>
    
    using namespace std;
    int student[35];
    int solution(int n, vector<int> lost, vector<int> reserve) {
        int answer = 0;
        for(int i : reserve) student[i] += 1;
        for(int i : lost) student[i] += -1;
        for(int i = 1; i <= n; i++) {
            if(student[i] == -1) {
                if(student[i-1] == 1) 
                    student[i-1] = student[i] = 0;
                else if(student[i+1] == 1) 
                    student[i] = student[i+1] = 0;
            }
        }
        for(int i  = 1; i <=n; i++)
            if(student[i] != -1) answer++;
    
        return answer;
    }

    다른 방법

    lost, reserve 벡터 원소를 비교하여 삭제하면서 푸는 방식이다.

    반복문을 사용해 벡터 원소를 접근하는데 erase 사용은 적절하지 않다고 생각한다.

    반복문 중에 기준 벡터의 크기가 달라지기 때문에 break를 사용해서 예외처리를 했지만 좋은 방식은 아니다.

    #include <string>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    int solution(int n, vector<int> lost, vector<int> reserve) {
    
        for(int i=0; i<lost.size();i++){
            for(int j=0; j<reserve.size();j++){
                if(lost[i]==reserve[j]){
                     lost.erase(lost.begin()+i);
                    reserve.erase(reserve.begin()+j);
                    i=-1;
                    break;
                }
            }
        }
    
        int answer = n-lost.size();
    
        sort(lost.begin(),lost.end());
        sort(reserve.begin(),reserve.end());
        for(int i=0; i<lost.size();i++){
            for(int j=0; j<reserve.size();j++){
                if(lost[i]-1==reserve[j]|| lost[i]+1 ==reserve[j]){
                    answer++;
                    reserve.erase(reserve.begin()+j);
                    break;
                }
            }
        }
    
        return answer;
    }

     

    728x90

    댓글

© 2022. code-space ALL RIGHTS RESERVED.