728x90
제 주관적인 코딩이라 무조건적으로 이게 정답은 아닙니다!
출처
https://programmers.co.kr/learn/courses/30/lessons/42862
내 풀이
#include <string>
#include <vector>
using namespace std;
int solution(int n, vector<int> lost, vector<int> reserve) {
//배열 false로 초기화
bool Have[31]={false,};
bool Not_Have[31]={false,};
//전체 학생 - 체육복 없는 학생 빼줌
int answer = n-lost.size();
//먼저 여분 있는 사람 True
for(int i=0;i<reserve.size();i++)
{
Have[reserve[i]] = true;
}
//체육복 잃어버린 사람 체크
for(int i=0;i<lost.size();i++)
{
//가지고 있는 사람이 만약 잃어버렸음 못빌려주니 false로 변경
//answer++ -> 처음 answer에서 lost 크기만큼 뺐으니 다시 더해줘야함
if(Have[lost[i]])
{
Have[lost[i]] = false;
answer++;
}
// 위의 조건이 성립되지 않는다면 true로 해서 잃어버렸다는걸 표시
else Not_Have[lost[i]]= true;
}
//전체 학생을 체육복 체크
for(int i=1;i<=n;i++)
{
//만일 갖고 있지 않다면
if(Not_Have[i])
{
//만약 앞에 학생 갖고 있으면
if(Have[i-1])
{
Have[i-1] = false;
Not_Have[i] = false;
answer++;
}
//뒷 학생이 갖고 있다면
else if(Have[i+1])
{
Have[i+1] = false;
Not_Have[i] = false;
answer++;
}
}
}
return answer;
}
해설
처음 정답으로 출력될 answer값을 전체 학생 수에 체육복이 없는 학생 수만큼 빼주었다.
그리고 여분의 체육복을 갖고 있는 Have 배열, 갖고 있지 않는 Not_Have 배열을 선언, 먼저 Have 배열에 갖고 있는 사람을 true처리 Not_Have 배열에서는 여분의 체육복을 갖고 있는 사람이 도난 당했을 경우도 있기 때문에 if문과 else문으로 걸러주어 체크해 주었다.
그리고 마지막에 전체 학생들의 체육복 보유 여부를 체크하여 체육복이 없는 학생이 앞 뒤 학생에게 체육복을 빌릴 수 있다면 빌린 학생의 Have를 false, 도난 당한 학생의 Not_Have도 false, answer++ 해주었다.
그리고 마지막에 answer값을 출력해주었다.
더보기
제가 설명을 잘못해서 코드 보시는게 더 이해가 더 잘 될겁니다...........
느낀점
프로그래머스에서 풀어보니 코딩이 틀렸는지 맞았는지 알 수 없고 디버그가 힘들어서 에러 찾는게 힘들었지만 익숙해져야겠다.