[프로그래머스 / C++] 42862번 체육복

akim·2023년 4월 10일
0

Algorithm 

목록 보기
11/14
post-thumbnail

문제 재정의 및 추상화

결론: 앞 뒤 번호끼리 서로 빌려줄 수 있을 만큼 빌려줘서 최대 인원이 체육복을 입게 하라


문제 접근 방식

  • 체육복 개수에 대한 정보를 따로 저장해두자.
    -> 학생에 대한 배열을 하나 새로 만든다!

해법을 찾는데 결정적이었던 깨달음

📌 학생들이 가진 체육복 개수는 -1(없음), 0(기본 상태), 1(여분 하나 더 있음) 중 하나다.

문제 풀이 로직

  1. 체육복을 도난당한 학생 배열 lost에 담긴 학생 번호 인덱스에 맞춰 학생 배열 student의 값을 -1로 넣어준다.
  2. 체육복을 더 갖고 있는 학생 배열 reserve에 담긴 학생 번호 인덱스에 맞춰 학생 배열 student의 값을 1로 넣어준다.
  3. 학생 수만큼 학생 배열 student를 돌면서 도난당한(-1) 학생이 나오면 앞 뒤를 검사한다.
    3-1. 앞 학생이 체육복을 더 갖고 있는(1) 학생이면 해당 학생을 기본 상태(0)로 바꿔주고 받은 학생도 기본 상태(0)로 바꿔준다.
    3-2. 뒤 학생이 체육복을 더 갖고 있는 학생일 경우에도 같은 로직을 취한다.
  4. 학생 배열 student를 돌며 기본 상태(0) 혹은 더 갖고 있는 상태(1)가 나오면 answer 값을 증가시킨다.
  5. answer 값을 반환한다.

문제 풀이

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

int student[31];

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    
    for(int i = 0; i < lost.size(); i++){
        student[lost[i]]--;
    }
    
    for(int i = 0; i < reserve.size(); i++){
        student[reserve[i]]++;
    }
    
    for(int i = 1; i <= n; i++){
        if(student[i] == -1){
            if(student[i - 1] == 1){
                student[i - 1] = 0;
                student[i] = 0;
            }
            else if(student[i + 1] == 1){
                student[i + 1] = 0;
                student[i] = 0;
            }
        }   
            
        if(student[i] >= 0) answer++;
    }
    
    return answer;
}
profile
학교 다니는 개발자

0개의 댓글