Information Security ˗ˋˏ ♡ ˎˊ˗

Programming/Programming 풀이

[Programmers] 체육복 풀이(C++)

토오쓰 2020. 9. 26. 13:32

문제 설명

 

바로 앞 번호의 학생이나 바로 뒷 번호의 학생에게만 체육복을 빌려줄 수 있다. 전체 학생의 수 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

 

 

참고

0urtrees.tistory.com/20