문제 설명
바로 앞 번호의 학생이나 바로 뒷 번호의 학생에게만 체육복을 빌려줄 수 있다. 전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육 수업을 들을 수 있는 학생의 최댓값을 return 해야 한다.
Error Code
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int solution(int n, vector<int> lost, vector<int> reserve) {
if (n<2 && n>30)
return 0;
int answer = n-lost.size();
for(int i=0; i<lost.size();i++){
for(int j=0; j<reserve.size();j++){
if(lost[i]-1 == reserve[j]){
reserve[j] = -1;
lost[i] = -1;
answer +=1;
}
if (lost[i]+1==reserve[j]){
reserve[j] = -1;
lost[i] = -1;
answer +=1;
}
}
}
return answer;
}
오류 원인
- 앞 번호 사람과 뒷번호 사람에게 체육복을 빌려줄 수 있다는 점만 생각하여 코드를 작성한 것 같다. -1로 설정한 이유는 중복을 방지하기 위해 0부터 해당 배열의 size()에 없는 -1을 설정하였다. answer는 체육복이 없는 사람들을 n명에서 지우고 체육복을 빌린 사람의 수를 더해주었다.
- 몇몇 테스트 케이스에서 실패
- 다른 방법을 참고하여 n명의 학생 중에서 체육복을 가지고 있는지 도난당했는지를 확인할 수 있는 배열을 만들어서 계산을 해야 한다는 것을 깨 달았다.
Code
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int solution(int n, vector<int> lost, vector<int> reserve) {
vector<int> arr(n,1);
int answer = 0;
for(int i=0; i<lost.size();i++){
arr[lost[i]-1]--;
}
for(int j=0; j<reserve.size();j++){
arr[reserve[j]-1]++;
}
for(int i=0; i<arr.size();i++){
if(i!=0&&arr[i-1]==0){
if(arr[i]==2){
arr[i]--;
arr[i-1]++;
}
}
if(i!=arr.size()-1&&arr[i+1]==0){
if(arr[i]==2){
arr[i]--;
arr[i+1]++;
}
}
}
for(int i=0; i<arr.size();i++){
if(arr[i] !=0)
answer++;
}
return answer;
}
풀이
-
list를 만들어서 체육복의 유무를 0과 2로 설정한다.
-
리스트 size 만큼 반복하여 맨 처음 사람이 아니고 앞사람이 체육복이 없다면(==0)
⇒ 자신이 체육복이 있을 경우(==2) 자기 자신은 리스트에서 -1 해주고 앞사람에게는 +1을 해준다.
-
반대로 맨 뒷사람이 아니고 뒷 사람이 체육복이 없다면 위와 같이 해준다.
ScreenShot
참고
'Programming > Programming 풀이' 카테고리의 다른 글
[Algorithm] 문자열 재정렬 (C++) (719) | 2020.10.17 |
---|---|
[Baekjoon] 18406번 럭키 스트레이트(C++) (460) | 2020.10.17 |
[Algorithm] 그리디 알고리즘 - 거스름돈 문제(C++) (0) | 2020.09.26 |
[Programmers] 이상한 문자 만들기 풀이(C++) (0) | 2020.09.11 |
[Programmers] 시저 암호 풀이(C++) (0) | 2020.09.11 |