반응형
programmers.co.kr/learn/courses/30/lessons/42862
코딩테스트 연습 - 체육복
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번
programmers.co.kr
구현 방법
- 체육복을 갖고 와서 수업 참여가 가능한 학생은 1을 더해줘서 표기
- 체육복을 도둑맞아 잃어버린 학생들은 수업 참여가 불가능하므로 1 빼주기
- 체육복 여분을 가져온 학생들도 1 더해줘서 표기
즉,
- 숫자가 2인 학생은 수업 참여가 가능하며 여분 체육복을 빌려줄 수 있는 학생
- 숫자가 1인 학생은 수업 참여가 가능한 학생
- 숫자가 0인 학생은 수업 참여가 불가능하고, 옆 학생에게 빌려야 하는 학생
배열을 위의 아이디어와 같이 설정해주고, 마지막에 학생의 수만큼 반복문을 돌아 숫자가 1 이상인 학생들의 개수를 담아 정답으로 제출했습니다.
해당 아이디어의 구현은 아래 소스코드와 같습니다.
소스코드
#include <bits/stdc++.h>
using namespace std;
int solution(int n, vector<int> lost, vector<int> reserve) {
int answer = 0;
//30명의 학생이 올수있으니 0으로 배열 초기화
int students[31]={0,};
//도둑맞기 전에 가능한 학생 1더해줘서 표시
for(int i=0;i<n;i++) {
students[i]++;
}
//도둑맞으면서 참여 못하는 사람 빼주기
for(int i=0;i<lost.size();i++) {
students[lost[i] - 1]--;
}
//여분 가져온 학생 더해주기
// (도둑 안맞고, 여분 있으면 해당 학생은 2)
for(int i=0;i<reserve.size();i++)
students[reserve[i]-1]++;
//학생 수 만큼 반복
for(int i=0;i<n;i++) {
//도둑맞은 학생의 경우
if(students[i]==0) {
//앞사람 빌려올 수 있는지 확인 후 빌림
if(students[i-1]==2) {
students[i-1]--;
students[i]++;
} //뒷사람 빌려올 수 있는지 확인하고 빌림
else if(students[i+1]==2) {
students[i+1]--;
students[i]++;
}
}
}
//최종 배열에 체육복을 1개 이상 갖고있는 학생 수 카운트
for(int i=0;i<n;i++) {
cout << students[i] << " ";
if(students[i]!=0) {
answer++;
}
}
return answer;
}
반응형
'코딩테스트 > 프로그래머스(lv1)' 카테고리의 다른 글
[프로그래머스 Level 1] 비밀 지도 (C++) (0) | 2021.01.30 |
---|---|
[프로그래머스 Level 1] 실패율 (C++) (0) | 2021.01.30 |
[프로그래머스 Level 1] K 번째 수 (C++) (0) | 2021.01.24 |
[프로그래머스 Level 1] 모의고사 (C++) (0) | 2021.01.24 |
[프로그래머스 Level 1] 완주하지 못한 선수 (C++) (0) | 2021.01.24 |
댓글