본문 바로가기
  • 피곤한 일상에 초록물약 한잔
코딩테스트

[프로그래머스] 체육복

by 0r4c13 2021. 3. 15.
반응형
#include <string>
#include <vector>

using namespace std;
int student[31];
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(int i = 0; i <= n; i++){
        if(student[i] == -1){
            if(student[i - 1] > 0){
                student[i] = student[i - 1] = 0;
            }
            else if(student[i + 1] > 0){
                student[i] = student[i + 1] = 0;
            }
        }
    }
    for(int i = 1; i <= n; i++){
        if(student[i] != -1) answer++;
    }
    return answer;
}

탐욕법 탭의 체육복 문제.

 

for 반복문의 새로운 사용방법을 배운 시간이었다.

 

완전히 비효율적인 방법으로 문제를 풀다가막혀 문제를 찾아보고 풀게 되었는데, 진짜 코앞에서 헤메고 있었던것 이었다.

 

for(int i : reserve) 를 이용하여 i의 값에 reserve의 값을 하나하나 넣어준다. foreach와 비슷한 사용방법 같았다.

 

그리고 각각의 학생 번호에 체육복의 여분갯수를 추가하여, 체육복을 더 가지고 있는 학생은 +1을, 보유하지 않은 학생은 -1을 넣어 하나하나 체크를 시작한다.

 

학생을 한명한명 돌면서, 체육복이 -1개인 학생을 발견하면, 우선 앞번호의 학생에게 체육복이 있는지 체크하고, 없다면 뒷 학생을 체크하여 둘중한명에게 체육복을 가져오거나, 혹은 아무에게도 가져오지 못하게 된다.

 

확인이 끝난 후에는 학생 번호 리스트를 다시한번 반복문으로 돌려, 체육복이 -1개가 아닌 학생의 수만 세어 answer에 더해 리턴하는것으로 끝나는 것.

 

공부를 하면할수록 몰랐던 부분이 많았던걸 깨닫는중이다...

 

 

 

문제출처 : programmers.co.kr/learn/courses/30/parts/12244

반응형

댓글