티스토리 뷰

알고리즘

[프로그래머스/c++] 체육복

개발기록 :) 2022. 8. 16. 22:07

성공 코드(내 코드)

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    
    answer=n-lost.size();
    // lost와 reserve를 오름차순으로 정렬하기
    sort(lost.begin(), lost.end());
    sort(reserve.begin(), reserve.end());
    for(int i=0; i<lost.size(); i++){
        for(int j=0; j<reserve.size(); j++){
            if(lost[i]==reserve[j]){
                answer++;
                // 해당 lost의 원소 지우고 i--를 해주어야 놓치지 않고 탐색 가능
                lost.erase(lost.begin()+i--);
                // 해당 reserve의 원소 지우고 j--를 해주어야 놓치지 않고 탐색 가능
                reserve.erase(reserve.begin()+j--);
                break;
            }
        }
    }
    for(int i=0; i<lost.size(); i++){
        for(int j=0; j<reserve.size(); j++){
            if(lost[i]-1 == reserve[j]){
                answer++;
                // 해당 reserve의 원소 지우고 j--를 해주어야 놓치지 않고 탐색 가능
                reserve.erase(reserve.begin()+j--);
                break;
            }
            if(lost[i]+1 == reserve[j]){
                answer++;
                // 해당 reserve의 원소 지우고 j--를 해주어야 놓치지 않고 탐색 가능
                reserve.erase(reserve.begin()+j--);
                break;
            }
        }
    }
    
    return answer;
}

 

2023.01.08 풀이

  • 벡터 st를 만들어 모든 학생들이 가지고 있는 체육복 수를 표현한다.
    • 처음에는 모두 1로 초기화 한다.
    • lost 벡터를 탐색하며 체육복을 잃어버린 학생의 st 값을 1 감소시킨다.
    • reserve 벡터를 참색하며 체육복을 여분으로 가지고 있는 학생의 st 값을 1 증가시킨다.
  • 벡터 st로 1번째 학생부터 탐색하며 해당 학생이 2벌의 체육복을 가지고 있는 경우
    • 바로 앞번호 학생이 체육복이 없는 경우 체육복을 빌려준다.
    • 또는 바로 뒷번호 학생이 체육복이 없는 경우 체육복을 빌려준다.
    • 빌려줄 때, 자신의 체육복 개수를 하나 줄이고 빌려받는 학생의 체육복 개수를 하나 증가시킨다.
  • 벡터 st를 1번째 학생부터 탐색하며 체육복을 1개 이상 가지고 있는 경우 answer를 1씩 증가시킨다.

🤨 풀고 보니 밑에 풀이 방법이랑 비슷하네요 !

#include <string>
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    vector<int> st(32, 1);
    for(int i=0; i<lost.size(); i++){
        st[lost[i]]--;
    }
    for(int i=0; i<reserve.size(); i++){
        st[reserve[i]]++;
    }
    for(int i=1; i<=n; i++){
        if(st[i]==2){
            if(st[i-1]==0){
                st[i]--;
                st[i-1]++;
            } else if(st[i+1]==0){
                st[i]--;
                st[i+1]++;
            }
        }
    }
    for(int i=1; i<=n; i++){
        if(st[i]>=1){
            answer++;
        }
    }
    
    
    return answer;
}

 


다른 풀이 코드

  • student 배열을 사용하여 체육복 여분 하나 더있는 학생은 +1, 없는 학생은 -1 해준다.
  • student[i]의 값이 -1인 경우
    • student[i-1]이 1이면 student[i]에게 빌려주고
      • student[i-1]에게 못빌리는 경우 student[i+1]이 1이면 student[i]에게 빌려준다.
#include <string>
#include <vector>

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

    return answer;
}