개발하는 kim-hasa

[c++][프로그래머스] 체육복 본문

Algorithm/Programmers(c++)

[c++][프로그래머스] 체육복

kim-hasa 2021. 7. 26. 18:16

https://programmers.co.kr/learn/courses/30/lessons/42862

 

코딩테스트 연습 - 체육복

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번

programmers.co.kr

최대 n명 들을 수 있으므로, answer을 n으로 초기화 합니다.

 

학생의 최대 수가 30이므로, 30칸의 배열을 생성 후, 0으로 초기화 합니다.

 

1. 잃어버린 번호의 학생을 -1로 변경합니다.

2. 추가로 가지고 있는 번호의 학생을 ++ 합니다.

-> 1로 초기화 하는 경우에는 오류 발생 ! 도난당한 사람이 추가로 가지고 있을 수도 있기 때문입니다.

 

3. n명만큼만의 반복문을 돌리면서

3-1. 만약 없다면 뒤 번호를 확인해서 가져옵니다.

3-2. 뒤 번호가 없다면 앞에서 가지고 옵니다. 그래도 없다면, 들을 수 없으므로 answer-- 합니다.

 

#include <string>
#include <vector>

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = n;
    int student[30] = {};   // 학생 배열
    
    for(int i=0; i<lost.size(); i++)    // 잃어버린 사람 번호
    {
        student[lost[i]-1] = -1;
    }
    for(int j=0; j<reserve.size(); j++) // 추가로 가지고 있는 사람 번호
    {
        student[reserve[j]-1]++;
    }
    
    for(int k=0; k<n; k++)
    {
        if(student[k] == -1)
        {
            if(student[k+1] == 1 && k<n-1)  // 마지막 사람은 그 다음이 없으므로
            {
                student[k] = 0;
                student[k+1] = 0;
            }
            else if(student[k-1] == 1 && k>0)   // 맨 처음 사람은 앞에 없기 때문에
            {
                student[k] = 0;
                student[k-1] = 0;
            }
        }
        
        if(student[k] == -1)    // 못 듣는 사람 answer--
            answer--;
    }
    return answer;
}

※ 코드가 지저분할 수 있습니다.