상세 컨텐츠

본문 제목

프로그래머스 Level 1 - 체육복(C++)

학생일기/알고리즘

by jaws99 2019. 11. 24. 20:25

본문

반응형

저를 포함해서 문제를 한 번에 이해하지 못한 분들이 많은 거 같습니다 질문하기가 75개로 본 것 중 가장 많았습니다!

저는 5번 째 제한사항 "여벌을 가져온 학생이 체육복을 도난당했을 수 있다."에서 걸렸습니다ㅜㅜ

 

#include <string>
#include <vector>
using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0, i;
    vector<int> arr(n,1);
     
    for(i=0; i<reserve.size(); i++)
        arr[reserve[i]-1]++;
    for(i=0; i<lost.size(); i++)
        arr[lost[i]-1]--;
    
    for(i=0; i<n-1; i++){
        if(!arr[i] && arr[i+1] > 1){
            arr[i] = 1;
            arr[i+1]--;
        }
        else if(!arr[i] && arr[i-1] > 1){
            arr[i] = 1;
            arr[i-1]--;
        }
    }
    
    for(i=0; i<n; i++)
        if(arr[i]) answer++;
    
    return answer;
}

 

1. 첫 번째 두 번째 for

arr(n,1)로 배열을 1로 초기화를 합니다. lost, reserve 배열은 학생들의 번호를 알려줍니다. 1번부터 시작해도 되지만, 저는 배열의 시작을 0번부터 하고 싶어서 -1을 해줬습니다. 여분이 있는 학생은 2를, 여분이 없는 학생은 0으로 만들었습니다.

 

2. 세 번째 for if~

!arr[i]는 arr[i]==0으로 생각해도 됩니다. 체육복이 없는 학생 앞, 뒤로 혹시 여벌이 있는 학생이 있다면 체육복이 없는 학생을 1로 바꿔서 빌렸다고 표현하고 빌려준 학생은 --를 해서 빌려줬다고 표현했습니다.

 

3. 마지막 for

arr[i]가 0이 아니면 계속 더합니다. 0인 경우는 가져오지 못했거나 빌리지도 못한 경우이기 때문에 빼고 더합니다.

반응형

관련글 더보기