[프로그래머스/C++]Lv.1 - 체육복

YH J·2023년 5월 23일
0

프로그래머스

목록 보기
96/168

문제 링크

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

내 풀이

map을 사용했다. 일단 2벌인 사람들을 전부 value에 2를 넣고 2벌인데 잃어버린 사람은 -- 해준다( 벌써 많이 느려짐 )
그후 lost 를 for문 돌리면서 m[l]이 0이고 m[l-1]이나 m[l+1]이 2인 경우만 빌려주기 처리한다.
다 끝낸 후 아직도 0인 갯수를 샌 뒤 전체에서 뺀다.

내 코드

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

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    map<int,int> m;
    sort(lost.begin(),lost.end());
    sort(reserve.begin(), reserve.end());
    
    for(int r : reserve)
        m[r] += 2;
    
    for(int l : lost)
        if(m[l] == 2)
            m[l]--;
    
    for(int l : lost)
    {
        if(m[l] == 0 && (m[l-1] == 2 || m[l+1] == 2))
        {
            m[l] = 1;
            m[l-1] == 2 ? m[l-1]-- : m[l+1]--;
        }
    }
    
    for(int l : lost)
        if(m[l] == 0)
            answer++;
    
    
    return n - 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;
}

다른 사람의 풀이 해석

굳이 map을 쓰지않고 array 하나를 만든다. 최대 인원이 30이지만 index 오버를 방지하기 위해 35까지 넉넉하게 했다. reserve에 있는 학생은 +1 lost에 있는 학생은 -1을 한다. 그 후 -1인 학생만 양 옆을 탐색해서 처리해주면 된다.

profile
게임 개발자 지망생

0개의 댓글