본문 바로가기
프로그래머스 코딩테스트/Level 1

프로그래머스) 체육복 (C++)

by xortl98 2022. 4. 30.
728x90

제 주관적인 코딩이라 무조건적으로 이게 정답은 아닙니다!

 

출처 

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

 

코딩테스트 연습 - 체육복

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

programmers.co.kr

 

 내 풀이 

#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값을 출력해주었다.

 

더보기

제가 설명을 잘못해서 코드 보시는게 더 이해가 더 잘 될겁니다........... 

 느낀점 

프로그래머스에서 풀어보니 코딩이 틀렸는지 맞았는지 알 수 없고 디버그가 힘들어서 에러 찾는게 힘들었지만 익숙해져야겠다.