본문 바로가기
개인공부/Algorithm(C, C++)

Programmers 체육복문제 (Greedy)

by 저세상판단 2020. 9. 24.
반응형

코딩테스트 연습으로 푼 문제인데 처음이라그런지 푸는데 굉장히 오래걸렸다.

처음 시도로는 몇몇 테스트 케이스가 계속 오류가 떠서 결국 검색해보았는데 

다른사람들의 풀이 방식만을 보고 혼자 코딩해보아서 좀 지져분하다.

 

 

#include 
#include 

using namespace std;

int solution(int n, vector lost, vector reserve) {
    int answer = 0;
    
    //학생들의 체육복 유무를 확인하기 위한 배열 생성 기본값은 0 
    // -1 : 체육복이 없음, 0 : 체육복 있음, 1 : 체육복 2벌
    vector check(n);
	
    //체육복을 가지고 있지 않으면 -1로 세팅
    for(int i = 0; i < lost.size(); i++){
        check[lost[i]-1]--;
    }
	
    //체육복이 2벌이면 2로 세팅
    for(int i = 0; i < reserve.size(); i++){
        check[reserve[i]-1]++;
    }
	
    
    for(int i = 0; i < check.size(); i++){
    
    	//제일처음학생은 그 앞 학생이 없기 때문에 첫 학생에게 조건 적용
    	if(i == 0){
          if(check[i] < 0 ){
            if(check[i+1] > 0)
                {
               		//체육복이 없는 학생을 -1에서 0으로 변경
                    check[i]++;
                    
                    //체육복을 빌려준 학생을 1에서 0으로 변경
                    check[i+1]--;
                }
            }
        }
		
        //마지막 학생도 그 뒤 학생이 없기때문에 마지막학생 조건 적용
        if(i > 0 && i < check.size()-1){
           if(check[i] < 0 ){
            if(check[i+1] > 0){
            
            	//체육복이 없는 학생을 -1에서 0으로 변경
                check[i]++;
                
                //체육복을 빌려준 학생을 1에서 0으로 변경
                check[i+1]--;
            }
            if(check[i-1] > 0){
                check[i]++;
                check[i-1]--;
            }
        }

    }

    }
    
    // 값이 0과 1인 학생은 체육복이 있는 학생이기 때문에 학생 수 증가
    for(int i = 0; i < check.size(); i++){
        if(check[i] == 0 || check[i] == 1)
            answer++;
    }
    return answer;
}

반응형