[코딩테스트 C++] 체육복

후이재·2020년 10월 10일
1

오늘의 문제

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

체육복

나의 풀이

#include <string>
#include <vector>

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    for(int i=0;i<lost.size();i++){
        for(int j=0;j<reserve.size();j++){
            if(lost[i] == reserve[j]){
                lost.erase(lost.begin()+i);
                reserve.erase(reserve.begin()+j);
                i--;
                break;
            }
        }
    }
    int answer = n - lost.size();
    
    for(int i=0;i<lost.size();i++){
        int n = lost[i];
        for(int j=0;j<reserve.size();j++){
            if( reserve[j] == n-1){
                reserve.erase(reserve.begin()+j);
                answer++;
                break;
            }
            if(reserve[j] == n+1){
                reserve.erase(reserve.begin()+j);
                answer++;
                break;
            }
        }
    }
    return answer;
}

풀이 법

  • 일단 입력범위가 얼마 되지않아 마음 편하게 풀었다.
  • 잃어버렸는데 여분이 있는 인원은 제외한 후 잃어버린 사람의 앞 뒤 사람이 여분인원에 있는지 체크했다.
  • answer은 n - 잃어버린 사람 수 로 초기화 해두었고, 여분을 받고 사라지는 순간 1을 더했다.
  • 숫자가 크지 않아 좋았다. 오늘 ㄴㅁ블은 숫자가 너무 커서 감당이 안되더라. 큰 숫자에 대한 연습도 필요하다.

모범 답안

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

배울 점

  • 배열을 만들어 있는 사람 없는사람을 체크하여 주위를 체크한다. 좋은방법이다. 직접비교하는 대신 메모리를 사용한것
profile
공부를 위한 벨로그

0개의 댓글