Posts 프로그래머스 고득점 Kit : 체육복
Post
Cancel

프로그래머스 고득점 Kit : 체육복

본 문제는 level1의 문제라서 사실 조금 안심하고 풀었던 문제이다. 오랜만에 level1 문제를 풀어서 그런지 반가웠고, 문제를 읽고 바로 어떻게 풀어야할지 머리속으로 알고리즘이 세워져서 기분이 좋았다. 물론 Greedy Algorithm 을 알고리즘 수업에서 배운지 조금 되어서 어떤 것이었는지 잠깐 헤맸지만, 부분적인 최적해가 전체적인 최적해가 된다는 글을 보고 기억이 퍼뜩 떠올랐다.


1. 문제

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다.
예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다.
체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.

전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.

제한조건

  • 전체 학생의 수는 2명 이상 30명 이하입니다.
  • 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
  • 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다.
    이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.


2. 알고리즘! 생각해보자

  1. 먼저 체육복을 잃어버린 사람을 제외하고 입을 수 있는 사람 수를 wear에 담는다.
  2. 여벌 체육복을 가져온 학생이 도난 당했을 경우, 다른 학생에게 체육복을 빌려줄 수 없으므로 이 경우를 제외시킨다.
  3. 그리고 이 경우에는 체육복을 입을 수 있는 학생이 증가된 것이기 때문에 wear을 증가시킨다.
  4. 남은 체육복을 잃어버린 학생들은 각각 한 명씩 자신의 앞번호나 뒷번호 학생에게 빌릴 수 있는지 확인한다.
  5. 빌릴수 있으면 wear을 증가시키고, 빌려준 학생의 번호와 빌린 학생의 번호는 -1로 바꿔준다.


3. 해결코드

[C++]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <vector>

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int wear = n - lost.size();

    for (int i = 0; i < lost.size(); i++) {
        for (int j = 0; j < reserve.size(); j++) {
            if (lost[i] == reserve[j]) {
                lost[i] = -1;
                reserve[j] = -1;
                wear ++;
                break;
            }
        }
    }

    for (int i = 0; i < lost.size(); i++) {
        for (int j = 0; j < reserve.size(); j++) {
            if (lost[i] - 1 == reserve[j]) {
                lost[i] = -1;
                reserve[j] = -1;
                wear ++;
                break;
            }

            if (lost[i] + 1 == reserve[j]) {
                lost[i] = -1;
                reserve[j] = -1;
                wear ++;
                break;
            }
        }
    }
    return wear;
}



4. 해결능력UP, 깊이 생각해보기

  • 뭔가 더 깔끔하게 코드를 짤 수 있을 것 같은하는 아쉬움..
  • 아직 이 문제만으로는 탐욕법(Greedy)의 개념이 확실히 잡히지 않는다


5. 참고해서 문제해결 ٩( ᐛ )و

  • 없다 :)




1
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
This post is licensed under CC BY 4.0 by the author.

프로그래머스 고득점 Kit : 주식가격

프로그래머스 고득점 Kit : 조이스틱

Comments powered by Disqus.