문제풀이(Problem Solving)

프로그래머스, 체육복 : C++ [CPP]

게임이 더 좋아 2021. 11. 7. 19:32
반응형
728x170

 

이건 내가 푼 것보다 다른 사람이 훨씬 훨씬 잘풀었다.

참고해서 설명해보자

 

 

https://programmers.co.kr/learn/courses/30/lessons/42862?language=cpp 

 


 

#맞는 풀이

#include <string>
#include <vector>

using namespace std;
int student[35]; // 학생 배열(체육복의 수가 value)
int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    for(int i : reserve) student[i] += 1; // 여벌 체육복을 가지고 있는 학생
    for(int i : lost) student[i] += -1; // 체육복을 잃어버린 학생
    
    //위 for문을 거치면 결국 빌려줄 수 있는 체육복을 가진 학생의 값 1이 될 것이고
    // 체육복이 필요한 학생의 값이 -1이 될 것이다.
    // 잃어버렸지만 여벌의 체육복을 자기가 쓰는 학생은 0이 되거나 잃어버리지도 않은 학생이 0이 될 것이다.
    // 수업 가능한 학생은 value를 0이 가지거나 1을 가진 사람이 되겠다.
   
    for(int i = 1; i <= n; i++) {
        if(student[i] == -1) { //체육복이 필요하다면 앞 뒤의 번호를 조사한다.
            if(student[i-1] == 1) 
                student[i-1] = student[i] = 0; // 빌려준 사람도 수업 가능, 빌린 사람도 수업가능 
            else if(student[i+1] == 1) 
                student[i] = student[i+1] = 0; // 빌려준 사람도 수업 가능, 빌린 사람도 수업가능 
        }
    }
    
    //0과 1인 학생의 수를 센다 -> -1이 아닌 학생의 수를 센다
    for(int i  = 1; i <=n; i++)
        if(student[i] != -1) answer++;

    return answer;
}

 

이게 정말 직관적이고 좋은 풀이가 아닌가 싶다.

또 하나 배워간다.

+1 ,0, -1로 학생을 표현하는 법

728x90
반응형
그리드형