문제풀이/프로그래머스
[프로그래머스] 체육복
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;
}
반응형