📌체육복
/* 해당 문제 설명은 링크로 대체한다. */
!주의! ※ 공지 - 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가 추가되기 전에 풀었을 때 정렬 상관없이 돌아갔는데 지금은 정렬하지 않으면 안돌아간다.
'코딩테스트 공부 > Programmers' 카테고리의 다른 글
[C++] 위클리챌린지 6주차 복서 정렬하기 85002 (0) | 2021.09.06 |
---|---|
[C++] level3 이중 우선순위 큐 42628 (0) | 2021.09.05 |
[C++] level2 큰 수 만들기 42883 (0) | 2021.09.01 |
[C++] level2 구명보트 42885 (0) | 2021.09.01 |
[C++] level1 모의고사 42840 (0) | 2021.08.31 |
댓글