[ 문제 ] : https://programmers.co.kr/learn/courses/30/lessons/42862

 

코딩테스트 연습 - 체육복

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번

programmers.co.kr

 


[ 문제 접근 ]

 

student 벡터 하나 만들어서 체육복 개수를 나타내고 첫번째 학생부터 순회하면서 앞뒤로 체육복 빌릴 수 있으면 빌리고 answer++
 
첫번째와 마지막 학생은 뒤나 앞을 비교 할 수 없기 때문에 동일한 로직을 했을때 out of range 오류가 날 수 있기 때문에 따로 처리.

[ 최종 코드 ]

 

#include <string>
#include <vector>
#include<iostream>

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    vector<int> student(n+1,1); 
    for(auto elem:lost) student[elem]--;
    for(auto elem:reserve) student[elem]++;
    
    for(int i=1;i<=n;i++){
        if(i==1 && student[i]<1){ // 첫번째 학생이 체육복 없을때
            if(student[i+1] >1)
            {
                student[i+1]--;
                answer++;
                continue;
            }
        }
        else if(i==n && student[i]<1){ // 마지막 학생이 체육복 없을때
            if(student[i-1] >1) {
                student[i-1]--;
                answer++;
                continue;
              }
        }
        else if(student[i]<1){ 
            if(student[i-1] >1) {
                student[i-1]--;
                answer++;
                continue;
              }
            else if(student[i+1]>1){
                student[i+1]--;
                answer++;
                continue;
            }
        }
        else{
            answer++;
        }
    }
    return answer;
}

 


 

[ 다른 사람 풀이 ]

 

+ Recent posts