프로그래머스 - 체육복

Seungjae·2021년 6월 29일
0

알고리즘 문제풀이

목록 보기
26/27

프로그래머스 - 체육복


해당 문제는 학생들이 체육복을 가지고 있었는데 도난당했을 경우 서로 빌려주었을 때 체육복을 가지고 있을 수 있는 학생의 최댓값을 구하는 문제이다. 이때 체육복은 자신의 전, 후 사람과만 교환할 수 있다.

단순하게 생각하면 쉽게 풀 수 있는 문제였다. 우선 모두 1개씩 체육복을 가지고 있다고 가정하고 여벌을 가지고 있는 학생들에게 모두 1개씩 체육복을 더 부여한다. 그리고 도난 당한 학생들의 체육복을 한개씩 뺏는다. 그 후에 모든 학생들을 앞에서부터 확인하며 체육복이 2개일 경우 앞에 사람이 체육복이 없으면 주고, 앞에 사람은 있고 뒷 사람이 없으면 체육복을 주는 과정을 반복하면 해결되는 문제이다. 이러한 루프를 모두 거쳤다면 마지막에 모든 학생들을 확인하며 체육복을 2개이상 가진 학생들의 수를 세어주면 해결된다.

#include <string>
#include <vector>

using namespace std;

int arr[35];

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    for (int i = 1; i <= n; i++) 
        arr[i] = 1;

    for (auto el : reserve) 
        arr[el]++;
    
    for (auto el : lost) 
        arr[el]--;
    
    for (int i = 1; i <= n; i++) {
        if (arr[i] == 2 && 1 < i && !arr[i - 1]) {
            arr[i - 1]++;
            arr[i]--;
        }
        if (arr[i] == 2 && i < n && !arr[i + 1]) {
            arr[i + 1]++;
            arr[i]--;
        }
    }
    for (int i = 1; i <= n; i++)
        if (arr[i] > 0)
            answer++;
    return answer;
}

int main() {
    vector<int> lost;
    vector<int> re;
    lost.push_back(2);
    lost.push_back(4);
    //re.push_back(1);
    re.push_back(3);
    //re.push_back(5);
    int answer = solution(5, lost, re);
    printf("%d\n", answer);
    return 0;
}
profile
코드 품질의 중요성을 아는 개발자 👋🏻

0개의 댓글