본문 바로가기
Coding Test/C++

[프로그래머스] 체육복 C++ Code

by giem 2022. 8. 10.
반응형

 

2022.08.10 - [Coding Test/Python] - [프로그래머스] 체육복 Python Code

저번 python 포스트에 이어서 C++로 하겠다.

 

C++에서 벡터의 차집합을 쓰기에는 함수가 복잡하고 외우기 힘들 것 같아서

메모리를 조금 더 사용하는 방법을 선택하여 구현 방식이 다르다.


문제

 

문제가 자세하게 나와있다.

 

체육복을 도난당한 학생들이 자신의 바로 앞, 뒤 번호인 학생의 체육복을 빌려서

체육수업을 들을 수 있는 학생의 최댓값을 리턴하면 된다.


구현 방법

이번 구현 로직은 사실 파이썬과 비슷하게 짰었는데 지저분 해서 다른 사람 풀이의 구현을 가져왔다.

 

먼저 최대 학생수가 30명이기에

길이 30짜리 student 배열을 만들고

lost와 reserve를 각각 돌며 학생 배열을 초기화 했다.

옷이 없는 학생은 -1, 여벌이 있는 학생은 +1을 해주었다.

 

이렇게 되면 이전 파이썬 포스트의 문제는 자동으로 사라진다.

 

그 후 lost를 돌며 앞뒤 학생을 확인하고 빌려주는 처리(양쪽을 0으로 초기화)를 했다.

 

코드를 보겠다.


Code
#include <string>
#include <vector>

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int student[32] = {0, };
    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;
}

이것이 C의 정석적인 스타일이라고 생각한다.

최근에 너무 파이썬 위주로 생각해서 초기 설계부터 잘못 접근해버렸다.

 

vector의 find를 사용하기에는 복잡도가 n^2이 나와버리기 때문에 좋지 않기에

위 코드의 방법이 훨씬 낫다고 생각한다.

 

이전 파이썬 포스트와 비슷하게 구현한 C++ 코드가 궁금하다면

댓글로 문의 바랍니다...ㅎㅎ

반응형

댓글