최대 1 분 소요

Question

Q


Solution

  • 0번째 학생은 없으므로 n+1만큼 배열을 선언하고 1로 초기화 한다.
  • for문을 돌아 i 학생이 잃어버렸다면 -1, 여벌이 있다면 +1을 한다.
  • 이제 for문을 돌아 체육복이 없는 학생을 찾고 앞뒤로 여벌이 있는지 확인하여 연산해주면 된다.

Cord

#include <string>
#include <vector>

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) 
{
    int answer = 0;
    int uniforms[n+1];
    
    // 초기화
    for (int i = 1; i <= n; i++)
    {
        uniforms[i] = 1;
        
        // 잃어버림
        for (int j = 0; j < lost.size(); j++)
        {
            if (i == lost[j])
            {             
                uniforms[i]--;
            }
        }
        
        // 여벌
        for (int k = 0; k < reserve.size(); k++)
        {
            if (i == reserve[k])
            {
                uniforms[i]++;
            }
        }
    }        
    
    for(int i = 1; i <= n; i++)
    {
        // 잃어버린 학생 찾기
        if (uniforms[i] == 0)
        {
            // 여벌 건네주기
            if (i > 1 && uniforms[i-1] == 2)
            {
                uniforms[i]++;
                uniforms[i-1]--;
            }
            else if (uniforms[i+1] == 2 && i < n)
            {
                uniforms[i]++;
                uniforms[i+1]--;
            }
        }                
        
        // 체육복을 가진 사람 세기
        if (uniforms[i] > 0) 
        { 
            answer++; 
        }
    }

    return answer;
}
  • 고칠점: lost와 reserve의 idx는 순서가 학생의 번호와 일치하게 만들었으니 이를 이용하면 좀더 간략화 가능하다.

Result

Result