프로그래머스 체육복 - Level 1

Byungwoong An·2021년 6월 25일
1

문제

풀이전략

  1. 체육복을 도난 당한 학생들이 있을 때, 그 학생들은 여벌옷이 있는 본인, 이전 친구, 그 다음친구 이렇게 추가로 빌릴 수 있다.
  2. 본인 여벌옷을 본인이 챙기는게 우선이다. 따라서 먼저 본인이 잃어버렸는지, 그때 여벌옷이 있는지 여부를 확인하고, 이후에 그 뒤 앞 사람에게서 여벌옷을 확인한다.

코드

#include <string>
#include <vector>
#include <memory>
using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    
    // 먼저 본인이 도난 당했지만, 여벌옷을 가져왔을 때의 경우이다.
    // 이때 lost는 제거되고, reserve또한 제거된다.
    for(int i=0; i<lost.size(); i++){
        for(int j=0; j<reserve.size(); j++){
            if(lost[i] == reserve[j]){
                lost[i] = -1;
                reserve[j] = -1;
            }
        }
    }

    int cnt = 0;
    // 이후 도난 당한 학생의 앞뒤를 확인하여 만약에 여분이 존재한다면 빌려주는 절차를 진행한다.    
    for(int i=0; i<lost.size(); i++){
        for(int j=0; j<reserve.size(); j++){
            if(lost[i]-1 == reserve[j] || lost[i]+1 == reserve[j]){
                lost[i] = -1;
                reserve[j] = -1;
            }
        }
    }
    // 전체에서 lost값이 남아있는 학생들을 빼주면 이것이 체육수업을 들을 수 있는 학생의 최대값이다. 
    for(int i=0; i<lost.size(); i++){
        if(lost[i] != -1) cnt++;
    }
    return n-cnt;
}

다른분 코드


#include <string>
#include <vector>

using namespace std;
int student[35];
int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    // 나는 이부분에서 굳이 비효율적이게 이중 포문을 사용하였다. 
    // 여기서 reserve를 통해 1을 더해주고, 다시 lost로 1을 빼주는 과정이다.
    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;
}

소감

이 문제를 처음에 풀 당시 대체 왜 이중포문을 낭비했는지 모르겠다..... ㅋㅋㅋ 아직 많이 부족한것 같다. 다른분께서 푸신 방법처럼 저렇게 포문 하나로 충분히 풀 수 있었고, 나또한 생각할 수 있는 문제였다. 조금 더 집중하고 더 잘해봐야겠다.

profile
No Pain No Gain

0개의 댓글