ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (프로그래머스) 코딩테스트 연습 > 그리디 > 체육복
    코딩연습 2020. 3. 19. 23:33

    체육시간에 체육복을 도둑맞은 학생들이 있고, 여벌을 갖고 있는 학생들이 어떻게든 체육복을 빌려줘서 체육수업을 참가하게 한다. 이때 가장 많이 참여한 인원수를 구하는 문제이다. 이 문제에 몇 가지 주의해야 할 조건이 있는데, 도둑맞은 학생들의 번호는 중복되지 않고, 여벌을 갖고 있는 학생들의 번호도 중복되지 않는다. 여 별을 갖고 있는 학생도 도둑을 맞을 수 있으며, 그러면 여벌은 자신이 챙기고 다른 학생에게 빌려주지 못한다. 빌려주는 것도 자신의 번호에서 +1, -1에 해당하는 학생에게만 가능하고 학생 번호는 1~총원 범위 내에서 주어지고 총원의 범위는 2~30까지이다. 앞에서의 조건들을 대충 보고 문제를 풀면 매우 고생하게 된다. 플밍에서 주어진 제한 조건이 늘 핵심인 것 같다. 

    def solution(n, lost, reserve):
        unique_lost = set(lost) - set(reserve)
        unique_reserve = set(reserve) - set(lost)
        rolled_reserve = {element - 1 for element in unique_reserve}
        save = unique_lost - rolled_reserve
        middle = unique_lost & rolled_reserve
        back = {element + 1 for element in middle}
        rolled_reserve = {element + 1 for element in (unique_reserve - back)}
        answer = n - len(save - rolled_reserve)
        return answer

    체육복을 잃은 집합과 여벌을 갖고 있는 집합에서 중복을 제거해야 한다. 여벌을 갖고 있는 사람이 도둑맞으면 자신이 챙기니까... 그래서 집합 연산을 활용하여 중복을 제거하였다. 도둑을 맞지 않았으며 여벌을 갖고 있는 그룹의 학생은 주변 학생들에게 체육복을 빌려줘야 하니, 번호를 증감시킨 집합을 생성하였다. 도둑맞은 집합에서 번호를 증감시킨 집합을 차 집합하면 빌리지 못한 학생 집합이 나온다. 그렇다면 체육수업에 참여한 학생은 전체에서 빌리지 못한 학생을 제외한 숫자가 된다.

    댓글

Designed by Tistory.