문제풀이/프로그래머스

[프로그래머스] 체육복

Hyeon-Uk 2020. 11. 24. 00:23
반응형

programmers.co.kr/learn/courses/30/lessons/42862

 

코딩테스트 연습 - 체육복

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

programmers.co.kr


문제해결)

vector<int> st를 n개 만든뒤 모두 0으로 초기화시킨다. 여기서 0=자기체육복만 가지고있는사람, -1=도난당한사람, 1=여분의 체육복이 있는사람을 의미한다.

그런뒤 lost 배열을 돌며 해당 학생의 값을 -1해주고, reserve를 돌며 +1을 해준다. 이러면 여분이 있는데 도난당한 학생은 0 -1 +1 = 0이되서 나눠줄순 없지만, 수업에 참가할 수 있는 상태가 된다.

 

그런뒤 학생들을 돌면서

1.맨앞의 학생이 아니면서 해당학생의 뒷번호 학생이 체육복이 없는상태이고, 해당 학생이 여분의 체육복을 가지고있으면 뒷번호학생++, 자신--

2.맨 뒤의 학생이 아니면서 해당학생의 앞번호 학생이 체육복이 없는상태이고, 해당 학생이 여분의 체육복을 가지고 있으면 앞번호학생++,자신--

 

마지막으로 모든학생을 탐색하며 0이상인 학생들의 수를 세어주면 된다.

#include <string>
#include <vector>

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    vector<int> st(n,0);
    for(int i:lost){
        st[i-1]--;
    }
    for(int i:reserve){
        st[i-1]++;
    }
    for(int i=0;i<st.size();i++){
        if(i!=0&&st[i-1]==-1&&st[i]==1){
            st[i-1]++;
            st[i]--;
            continue;
        }
        if(i!=st.size()-1&&st[i+1]==-1&&st[i]==1){
            st[i+1]++;
            st[i]--;
        }
    }
    for(int i:st){
        if(i>=0){
            answer++;
        }
    }
    return answer;
}
반응형