마이구미+ 2023. 8. 2. 17:28

문제링크

 

프로그래머스

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

programmers.co.kr

<로직 고민/>

  • 일단 제한사항 마지막줄을 보니 lost와 reserve에 같은 번호가 있으면 그 번호는 빼야겠군!
  • lost를 for문으로 돌리면서 -1인 수가 reserve에 있으면 lost에서 해당 값을 빼고, 없으면 +1이 있는지 보고 있으면 lost에서 그 값을 빼고 없으면 그냥 둔다
def solution(n, lost, reserve):
    answer = 0
    for l in lost:
        if l in reserve:
            lost.remove(l)
        elif l-1 in reserve:
            lost.remove(l)
            reserve.remove(l-1)
        elif l+1 in reserve:
            lost.remove(l)
            reserve.remove(l+1)
    answer = n - len(lost)
    return answer
  • 일단 단순하게 이렇게 풀었는데 첫 번째 예시가 안 풀린다
  • 왜 lost에 4가 사라지지 않는 것인가..!!
  • if-elif-elif는 일단 별로인 거 같긴 한데 흠....어떻게 풀어야 하지..,,
def solution(n, lost, reserve):
    answer = 0
    
    # 낮은 숫자순으로 정렬
    lost.sort()
    reserve.sort()
    
    # 여벌 가져온 학생이 체육복 도난 당했을 때
    new_lost = []
    for l in lost:
        if l in reserve:
            reserve.remove(l)
        else:
            new_lost.append(l)
    lost = new_lost
    
    borrow = []
    # -1번 학생한테 빌려주기
    for l in lost:
        if l-1 in reserve and l not in borrow:
            reserve.remove(l-1)
            borrow.append(l)
            
    # +1번 학생한테 빌려주기
    for l in lost:
        if l+1 in reserve and l not in borrow:
            reserve.remove(l+1)
            borrow.append(l)

    answer = n - len(lost) + len(borrow)
    return answer
  • 조건을 나눴다
  • 근데도 11, 13~16번 케이스가 안 풀린다
  • 질문하기를 다 뒤져도 나랑 같은 케이스가 없다,,,
  • for문을 돌리는 배열을 for문 안에서 삭제하면 제대로 된 값이 안 나온다고 해서 borrow라는 배열을 추가했던 건데, 다른 사람들 푼 거 보니까 reserve를 돌리길래 나도 reserve를 돌리고, +1번 학생의 체육복을 빌려주기 위해 reserve로 for문을 다시 돌리면 이미 빌려준 애를 처리해야 해서 또 배열을 만들든가 해야 하기 때문에 elif로 했더니 통과됐다
  • 후............
  • 점수가 14점이나 나왔다..!!!

<완성된 풀이/>

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

    # 낮은 숫자순으로 정렬
    lost.sort()
    reserve.sort()

    # 여벌 가져온 학생이 체육복 도난 당했을 때
    new_lost = []
    for l in lost:
        if l in reserve:
            reserve.remove(l)
        else:
            new_lost.append(l)
    lost = new_lost

    for r in reserve:
        # -1번 학생한테 빌려주기
        if r - 1 in lost:
            lost.remove(r - 1)
        # +1번 학생한테 빌려주기
        elif r + 1 in lost:
            lost.remove(r + 1)

    answer = n - len(lost)
    return answer

<다른 사람 풀이/>

- 천재풀이1

def solution(n, lost, reserve):
    new_lost = set(lost) - set(reserve)
    new_reserve = set(reserve) - set(lost)

    for i in new_reserve:
        if i - 1 in new_lost:
            new_lost.remove(i - 1)

        elif i + 1 in new_lost:
            new_lost.remove(i + 1)
    return n - len(new_lost)
  • 내 코드랑 비슷한데 간결해서 가져와봤다
  • 여벌 체육복이 있는데 도난 당한 학생의 경우를 나는 7줄로 풀었는데, 이 사람은 for문 없이 단 2줄로 끝냈다..!
  • 그리고 정렬도 안 했다...!!!!
  • 정렬할 필요가 없었던 건가..?
  • 아닌데 내 코드에서 정렬하는 부분을 빼면 2개의 케이스에서 틀렸다고 나온다
  • 아 내 코드는 lost를 for문으로 돌리는 부분이 있어서 틀리는 케이스가 나오나보다
  • lost랑 reserve 둘 다 for문 돌리려면 순서가 중요하고, 위 풀이처럼 reserve만 for문 돌리려면 순서는 중요하지 않은 듯!