프로그래머스 코딩테스트 연습 - 체육복 (Level 1)
PS/Programmers

프로그래머스 코딩테스트 연습 - 체육복 (Level 1)

programmers

 

문제

프로그래머스 코딩테스트 연습 - 체육복 (Level 1)

https://programmers.co.kr/learn/courses/30/lessons/42862 

 

코딩테스트 연습 - 체육복

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

programmers.co.kr


사용 알고리즘

- 그리디

 

풀이

각각의 학생마다 가지고 있는 체육복의 개수를 모두 센다. (0/1/2)

체육복의 없는 학생의 경우 앞쪽에서부터 차례대로 빌릴 체육복이 있는지(=옆에 2개를 가진 학생이 있는지) 확인.

빌린 것을 포함하여 체육복이 하나라도 있는 학생 수를 세서 출력.

 

 

나의 코드

#include <string>
#include <vector>

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    vector<int> a;
    a.push_back(0);
    for(int i=1;i<=n;i++) a.push_back(1);
    for(auto i:lost) a[i]--;
    for(auto i:reserve) a[i]++;
    for(int i=1;i<=n;i++){
        if(a[i]==0){
            if(a[i-1]>1) a[i]=1;
            else if(a[i+1]>1){
                a[i+1]--;
                a[i]=1;
            }
        }
        if(a[i]) answer++;
    }
    return answer;
}

 

남의 코드(좋아요 최다 코드)

#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;
}

 

로직은 거의 비슷하다.

728x90