프로그래머스_탐욕법(Greedy)_체육복(python)

설탕유령·2022년 5월 10일
0

내 코드

def solution(n, lost, reserve):
    answer = 0
    answer = n - len(lost)

    lost.sort()
    reserve.sort()

    for index, value in enumerate(lost):
        if value in reserve:
            reserve[reserve.index(value)] = -1
            answer += 1
            lost[index] = 100

    for losted in lost:
        for index, reserved in enumerate(reserve):
            if (losted-1 <= reserved and reserved <= losted+1):
                answer += 1
                reserve[index] = -1
                break


    return answer

초기 헤멘 곳
기본적인 틀로 Lost를 기준으로 reserve 하나씩 정리해나가자 생각했다.
lost와 reserve에 중복된 경우를 고려하지 않았기에 문제가 발생했다.

중복을 고려하기 위해 처음에 서로 곂치는 경우 answer 카운터를 올리고 곂친 내용을 제거하는 방안으로 처리 했다.
이때 remove를 사용했는데, lost = [1,2,3] reserve = [1]인 경우 중복 제거를 하면서 reserve가 빈 상태로 되고, 이후 reserv를 for문으로 접근 시 빈 배열에 접근해 오류가 발생했다.
remove를 사용하지 않고, 중복된 lost에 100을 줘서 로직에서 벗어나도록 만들었다.
(reserve는 -1를 주었지만, lost도 -1를 주면 번호가 곂치면서 문제가 생겼다)

이후에도 테스트를 패스하지 못해서 확인한 결과
lost와 reserve가 정렬이 되지 않아 생긴 문제라 sort를 사용해 정렬을 했다.

평가
sort를 썻지만, sort 라이브러리를 분석해 코드가 길어지더라도 연습을 위해 직접 정렬 로직을 구현하는게 나을 듯 하다.
반복문이 2번 반복되는 모습이 보기 않좋다. 뭔가 더 좋은 방법이 있을 듯 하다
-1을 주고, 100을 주고 로직에서 제외시키는 방법은 급하게 땜빵친것처럼 보인다...
for in을 쓰면서 index 접근이 필요해 enumerate를 사용했다.
차라리 for, range, len을 섞어서 그냥 쓰는게 나을지도 모르겠다.

모범 답안

def solution(n, lost, reserve):
    _reserve = [r for r in reserve if r not in lost]
    _lost = [l for l in lost if l not in reserve]
    for r in _reserve:
        f = r - 1
        b = r + 1
        if f in _lost:
            _lost.remove(f)
        elif b in _lost:
            _lost.remove(b)
    return n - len(_lost)

평가
확실히 깔끔하고 아름답다
배열선언시 for과 if를 사용하는 기술은
List_Comprehension이라고 한다.
reserve에 내용을 for in을 이용해 r에 담고, r이 lost에 포함되지 않는 경우 r의 값을 _reserve에 담아준다.
중복 제거를 위한 방법으로 보인다.
lost에도 같은 처리를 하고, 중복제거가 끝난 _reserve와 _lost를 연산에 사용한다.

for을 이용해 _rserve를 r에 담고, 각 앞 뒤 번호를 변수를 선언한 뒤
중복이 제거되었기에 본인 r을 고려하지 않고 f, b를 이용해 앞 뒤에 lost를 제거한다.
결국 중복이 제거 된 후, reserve 기준으로 앞 또는 뒤 번호가 일치하는 lost를 전부 제거 한뒤
모든 처리가 끝난 lost를 기준으로 전체 학생에서 마지막까지 잃어버린 학생을 빼준다.

내 답안과 중복 처리 이후 처리가 정 반대이다.
처음에 학생 전체에서 잃어버린 학생을 빼준 뒤, 체육복을 구한 학생을 더해주는 방식을 썻기에 이런 방향은 생각하지 못한 듯 하다.
다만 이 해결법은 이후에 추가된 정렬이 안된 테스트 케이스를 해결하지 못한다고 한다.

매번 문제 풀때마다 .sort()라고 하고 넘어가면 볼품없으니, sort에 대해서 배워보도록 해야겠다.

profile
달콤살벌

0개의 댓글