본문 바로가기
코딩테스트 공부/Programmers

[C++] level1 체육복 42862

by 메정 2021. 9. 1.

📌체육복

/* 해당 문제 설명은 링크로 대체한다. */

!주의! ※ 공지 - 2021년 8월 30일 테스트케이스가 추가되었습니다.

📌풀이

먼저 체육복 여부를 확인하는 check 변수를 만든다. 얘는 n+1짜리로 만들고 1로 초기화하고 시작했다.

0 : 체육복을 가져오지 않은 애들
1 : 체육복을 챙겨온 애들
2 : 체육복을 여분도 가져온 애들

먼저 lost 배열과 reserve 배열을 오름차순으로 정렬해주어야 한다. //테스트케이스 13번, 14번 예외처리
왜냐. 문제에서 잃어버린 애들과 여분을 가져온 애들을 배열로 주어준다고만 했지 정렬해서 넣어줬다곤 안했기 때문에 13번, 14번에 [1,2,3,4,5] 같이 정렬된 친구들이 아닌 [4,5,2,1,3]과 같은 친구들이 오는 것 같다.

lost와 reserve 배열을 돌면서 체육복 없는 애들과 여분있는 애들을 다시 check 변수에 초기화해주고,
check 값이 0이라면 체육복이 없는 애들이기 때문에 2인(체육복 여분으로 있는 애들)값들에 대해서 --하고, ++해주어 체육복 상태를 만들어준다.

마지막으로 check값이 0이상이라면 체육복이 있어서 체육수업을 듣는 애들이니까 이 친구들에 한해서 answer를 ++해주었고,
마지막 return에서 --answer를 한 이유는 내가 배열을 0 ~ n+1까지 초기화해주었는데, 헷갈려서 체육복 여부는 애들 index에 맞게 1부터 시작했으므로 0번째 인덱스(0번 친구는 없는 존재)는 빼주기 위해서 1개 빼주었다.

📌코드

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve)
{
    int answer = 0;
    vector<int> check(n + 1, 1); //체육복 여부를 확인.

    //tc 13, 14번 예외처리
    sort(reserve.begin(), reserve.end());
    sort(lost.begin(), lost.end());

    //초기화 체육복없는 애들, 있는 애들
    for (int i = 1; i <= n; i++)
    {
        for (auto l : lost)
            if (l == i)
                check[i]--;
        for (auto r : reserve)
            if (r == i)
                check[i]++;
    }

    //체육복 없는 애들은 있는 애들한테 빌려
    for (auto l : lost)
    {
        if (check[l] == 0)
        { //없다는 것
            if (check[l - 1] == 2)
            {
                check[l - 1]--;
                check[l]++;
            }
            else if (check[l + 1] == 2)
            {
                check[l + 1]--;
                check[l]++;
            }
        }
    }

    for (auto c : check)
        if (c > 0)
            answer++;

    return --answer; //check[0]은 없는 경우니까 빼기
}

회고
새로 tc가 추가되기 전에 풀었을 때 정렬 상관없이 돌아갔는데 지금은 정렬하지 않으면 안돌아간다.

댓글