본문 바로가기
코딩테스트/프로그래머스(lv1)

[프로그래머스 Level 1] 체육복 (C++)

by 볼링치는 개발자 2021. 1. 24.
반응형

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

 

코딩테스트 연습 - 체육복

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

programmers.co.kr

체육복 문제

구현 방법

  • 체육복을 갖고 와서 수업 참여가 가능한 학생은 1을 더해줘서 표기
  • 체육복을 도둑맞아 잃어버린 학생들은 수업 참여가 불가능하므로 1 빼주기
  • 체육복 여분을 가져온 학생들도 1 더해줘서 표기

즉,

  • 숫자가 2인 학생은 수업 참여가 가능하며 여분 체육복을 빌려줄 수 있는 학생
  • 숫자가 1인 학생은 수업 참여가 가능한 학생
  • 숫자가 0인 학생은 수업 참여가 불가능하고, 옆 학생에게 빌려야 하는 학생

배열을 위의 아이디어와 같이 설정해주고, 마지막에 학생의 수만큼 반복문을 돌아 숫자가 1 이상인 학생들의 개수를 담아 정답으로 제출했습니다.

 

해당 아이디어의 구현은 아래 소스코드와 같습니다.

소스코드

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

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    //30명의 학생이 올수있으니 0으로 배열 초기화
    int students[31]={0,};

    //도둑맞기 전에 가능한 학생 1더해줘서 표시
    for(int i=0;i<n;i++) {
        students[i]++;
    }
    //도둑맞으면서 참여 못하는 사람 빼주기
    for(int i=0;i<lost.size();i++) {
        students[lost[i] - 1]--;
    }
    //여분 가져온 학생 더해주기
    // (도둑 안맞고, 여분 있으면 해당 학생은 2)
    for(int i=0;i<reserve.size();i++)
        students[reserve[i]-1]++;

    //학생 수 만큼 반복
    for(int i=0;i<n;i++) {
        //도둑맞은 학생의 경우
        if(students[i]==0) {
            //앞사람 빌려올 수 있는지 확인 후 빌림
            if(students[i-1]==2) {
                students[i-1]--;
                students[i]++;
            } //뒷사람 빌려올 수 있는지 확인하고 빌림
            else if(students[i+1]==2) {
                students[i+1]--;
                students[i]++;
            }
        }
    }
    
    //최종 배열에 체육복을 1개 이상 갖고있는 학생 수 카운트
    for(int i=0;i<n;i++) {
        cout << students[i] << " ";
        if(students[i]!=0) {
            answer++;
        }
    }
    return answer;
}
반응형

댓글