프로그래머스 - 체육복

well-life-gm·2021년 11월 15일
0

프로그래머스

목록 보기
55/125

프로그래머스 - 체육복

인풋
위와 같이 input이 들어왔을 때 n은 학생의 총 숫자. lost는 체육복이 없는 학생, reserve는 체육복 여벌이 있는 학생의 번호이다.
k번째 학생은 k-1과 k+1번의 학생에게만 체육복을 빌려줄 수 있다.

이 때, 전체 학생 중 체육복을 가지고 있는 학생의 수를 리턴하면 된다.

풀이 방법은 0부터 n까지 학생들의 체육복을 체크하면서 만약 k번째 학생의 체육복이 없다면 k-1번 학생이 여분이 있는지 체크하고 없다면 k+1번째를 체크하는 방식이다.

이 때 무조건 앞선 학생부터 체크해야하는데, 이는 우리가 index 0부터 스캔을 시작했기 때문이다.
예를 들어, 2 0 2 0 2 0 이라는 시퀀스가 있고 이 때 0은 체육복이 없고, 2는 여분이 있는 학생을 의미한다고 하자.
이 때 만약 뒤부터 체육복의 여벌을 빌린다고 하면 결과 값은 5가 될 것이다.
그러나 앞부터 빌린다고하면 6이 나올 수 있고, 이는 정답이다.
우리가 0부터 스캔을 시작했기 때문에 index가 낮은 학생으로부터 먼저 체육복을 빌려와야만 한다.
(반대로 뒤부터 시작하면 index가 큰 학생부터 여분을 체크하면 된다.)

코드는 아래와 같다.

#include <string>
#include <vector>

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    
    vector<int>student1(n, 1);
    
    for(int i=0;i<lost.size();i++) 
        student1[lost[i] - 1] = 0;
    
    for(int i=0;i<reserve.size();i++) 
        student1[reserve[i] - 1] = student1[reserve[i] - 1] == 0 ? 1 : 2;
    
    for(int i=0;i<n;i++) {
        if(student1[i] == 0) {
            if(i - 1 >= 0) {
                if(student1[i - 1] == 2) {
                    student1[i] = 1;
                    student1[i - 1] = 1;
                }    
            }
        }
        if(student1[i] == 0) {
            if(i + 1 < n) {
                if(student1[i + 1] == 2) {
                    student1[i] = 1;
                    student1[i + 1] = 1;
                }
            }
        }
    }
    
    for(int i=0;i<n;i++) 
        if(student1[i])
            answer++;
    
    return answer;
}

결과

profile
내가 보려고 만든 블로그

0개의 댓글