728x90

# 해당 포스팅은 이제 막 알고리즘 공부를 시작한 초보 수준에서 작성했음을 이해해주시고, 비난보다는 따뜻한 조언을 부탁드립니다.


안녕하십니까, 간토끼입니다.

오늘은 프로그래머스(Programmers)  체육복 문제에 대해 다뤄보겠습니다.

코딩테스트 고득점 Kit - 그리디(Greedy) 문제입니다.

 

1. 문제 링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

다음과 같이 접근하였습니다.

학생 수(n), 체육복을 잃어버린 학생 list(lost), 체육복 여벌옷을 가져온 학생 list(reserve)가 입력으로 주어지고,

체육복을 잃어버린 학생들에게 여벌옷을 빌려줘서 결과적으로 체육복을 입게 되는 학생 수의 최댓값을 구하는 문제입니다.

몇 가지 유의할 점이 있는데요.

1. 체육복을 잃어버린 사람과 여벌옷을 가져온 사람의 교번이 같다면, 본인이 입게 된다.

2. 체육복을 잃어버린 사람은 교번 상으로 +1, -1에 해당하는 사람만이 여벌 체육복을 빌려줄 수 있다.

(Ex. 잃어버린 사람 : 20번 -> 19번 or 21번의 학생이 여벌옷을 가져왔다면 빌려줄 수 있음.)

 

2. 접근 방법

다음과 같이 접근하였습니다.

먼저 위 유의할 점의 1번에 해당하는 부분을 해결하기 위해 same_same 함수를 구현해줬습니다.

만약 lost = [3,2]이고, reserve = [2,4] 라면 lost의 첫번째 case인 3번의 체육복을 reserve의 첫번째 case인 2번의 체육복을 빌려주게 되는데, 이때 2번은 잃어버리기도 했고 여벌옷을 가져오기도 했으므로 본인이 소유하게 됩니다.

즉 단순히 lost의 +1, -1한 값이 reserve에 있는지만 체크하게 되면 이러한 경우를 놓칠 수 있으므로,

same_same 함수를 통해 1차적으로 교번이 같은 경우가 있다면 이를 제거해줬습니다.

이후 plus_minus 함수를 통해 x+1, x-1이 reserve에 있는지 판단해서 있다면 제거해줬습니다.

최종적으로 도난 문제를 해결하고 남은 lost (= 옷을 빌리지 못한 친구들)의 수를 구해서 n에서 빼주면 답이 됩니다.

 

3. 코드

def same_same(k, reserve):
    # 만약 k가 reserve에 있으면 둘다 삭제
    if k in reserve:
        reserve.remove(k)
        return True
    else:
        return False

def plus_minus(x, reserve):
	# x+1, x-1이 reserve(여벌옷)에 있다면 대여해줌
    plus_x = x+1 ; minus_x = x-1
    if minus_x in reserve:
        reserve.remove(minus_x)
        return True
    elif plus_x in reserve:
        reserve.remove(plus_x)
        return True
    else:
        return False


def solution(n, lost, reserve):
    # 고려해야 될 경우
    # 1. x번이 체육복을 도난당하면, (x+1), (x-1)에 해당하는 친구가 체육복을 빌려줄 수 있음.
    # 2. 만약 x번이 도난 당하면 reserve의 x번과 대응됨.
    lost.sort()
    reserve.sort()
    list_lost = lost*1
    # x번이 도난 당했는데 여벌을 가져온 경우 : 샘샘
    for i in lost:
        a = same_same(i, reserve)
        if a == True:
            list_lost.remove(i)
    
    list_lost2 = list_lost*1
            
    # x번이 도난 당했는데 x+1, x-1이 여분이 있는 경우
    for j in list_lost:
        b = plus_minus(j, reserve)
        if b == True:
            list_lost2.remove(j)
            
    answer = n - len(list_lost2)
    return answer

 

감사합니다.

잘 읽으셨다면 게시글 하단에 ♡(좋아요) 눌러주시면 감사하겠습니다 :)

(구독이면 더욱 좋습니다 ^_^)

* 본 블로그는 학부생이 운영하는 블로그입니다.

따라서 포스팅에 학문적 오류가 있을 수 있으며, 이를 감안해서 봐주시면 감사하겠습니다.

 


- 간토끼(DataLabbit)

- B.A. in Economics, Data Science at University of Seoul

728x90

+ Recent posts