본문 바로가기
Programming Solve/프로그래머스

프로그래머스 - 체육복 / C++

by msm1029 2021. 3. 24.
반응형

문제 링크 : programmers.co.kr/learn/courses/30/lessons/42862

 

코딩테스트 연습 - 체육복

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

programmers.co.kr

 

 

문제 풀이

lost = [2, 3, 4], reserve = [3, 4, 5]인 경우 이론상 2가 3에게 빌리고 3이 4에게 빌리고 4가 5에게 빌리면 5를 출력해야 한다. 하지만, 조건에서 도난당했지만 여벌을 들고온 경우 본인 체육복을 입는다 하였으므로 3, 4는 본인 것을 입는다. 따라서, 2는 체육복을 입지 못하여 4명이 답이 된다.

 

정리하면, 다음의 과정을 거친다.

1. 전체 학생 수에서 체육복을 도난당한 학생의 수를 뺀다.

2. 도난당했지만 여분을 들고온 학생을 찾아 ++시켜준다.
3. 도난당했지만 앞 학생 또는 뒤 학생이 여분을 들고와 참여 가능한 학생 수를 ++시켜준다.

 

소스 코드

2021. 03. 24 코드

#include <bits/stdc++.h>
using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = n - lost.size(); //전체 참여 가능 학생 수 - 잃어버린 학생 수
    
    for(vector<int>::iterator lit = lost.begin(); lit != lost.end();){
        vector<int>::iterator it = find(reserve.begin(), reserve.end(), *lit);
        if(it != reserve.end()){
            answer++;
            reserve.erase(it);
            lost.erase(lit);
            continue;
        }
        ++lit;
    }
    
    for(int i=0; i<lost.size(); i++){
        vector<int>::iterator it = find(reserve.begin(), reserve.end(), lost[i] - 1);
        if(it != reserve.end()){
            answer++;
            reserve.erase(it);
        }
        else{
            it = find(reserve.begin(), reserve.end(), lost[i] + 1);
            if(it != reserve.end()){
                answer++;
                reserve.erase(it);
            }
        }
    }
    
    return answer;
}

 

2022. 02. 06 코드 리팩토링

#include <bits/stdc++.h>
using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = n - lost.size(); //전체 참여 가능 학생 수 - 잃어버린 학생 수
    
    //도난당했지만 여분을 들고온 학생 찾기
    for(auto lit = lost.begin(); lit != lost.end();){
        auto it = find(reserve.begin(), reserve.end(), *lit);
        
        if(it != reserve.end()){ //찾았다면
            answer++;
            reserve.erase(it);
            lost.erase(lit);
            continue; //erase하기 때문에 lost 배열의 인덱스를 증가시킬 필요가 없다
        }
        
        ++lit; //찾지 못했다면 인덱스를 증가시켜야 한다
    }
    
    //앞 또는 뒤의 학생이 빌려줄 수 있는 경우
    for(int i=0; i<lost.size(); i++){
        auto it = find(reserve.begin(), reserve.end(), lost[i] - 1);
        
        if(it != reserve.end()){ //앞 학생이 빌려줄 수 있는 경우
            answer++;
            reserve.erase(it);
        }
        else{ //뒤 학생이 빌려줄 수 있는 경우
            it = find(reserve.begin(), reserve.end(), lost[i] + 1);
            if(it != reserve.end()){
                answer++;
                reserve.erase(it);
            }
        }
    }
    
    return answer;
}

 

반응형