006. 체육복

12358 단어 algorithmalgorithm

문제

내 풀이 1(오답)

def solution(n, lost, reserve):
    answer = n - len(lost)
    
    for i in lost:
        for j in reserve:
            if i==j:
                reserve.remove(j)
                lost.remove(i)
                answer += 1
                break
    
    for i in lost:
        for j in reserve:
            if j==i-1 or j==i+1:
                reserve.remove(j)
                answer += 1
                
    return answer
  • 테스트 5번과 7번에서 통과되지 못함
  • 질문하기에서 정렬하면 해결된다고 해서 정렬시킴

내 풀이 2(오답)

def solution(n, lost, reserve):
    answer = n - len(lost)
    lost.sort()
    reserve.sort()
    
    for i in lost:
        for j in reserve:
            if i==j:
                reserve.remove(j)
                lost.remove(i)
                answer += 1
                break
    
    for i in lost:
        for j in reserve:
            if j==i-1 or j==i+1:
                reserve.remove(j)
                answer += 1
                
    return answer
  • 이번엔 1번, 6번, 7번 오류 불통..;;; 프로그래머스는 해당 번호 단계가 뭔지 안 알려주는 게 좀 단점인 듯 뭘 고쳐야 할 지 감이 안와요..;;ㅜㅜ

내 풀이 3(정답)

  • 찾아보다가 다른 분들도 정확하게 문제를 찾아내지 못하시는 것 같아서 다른 방법으로 풀기로 했다(아마 내 생각엔 n에 대해서 문제가 있는 듯 하다)
def solution(n, lost, reserve):
    answer = n - len(lost)

    for i in range(1, n+1): # 1~n까지 반복
        if i in lost and i in reserve: # 여벌이 있는데 도난당한 사람
            reserve.remove(i) # 제거
            lost.remove(i) # 제거
            answer+=1 # 수업 참여 +1

    for i in range(1, n+1): # 1~n까지 반복
        if i in lost: # 도난 당한 사람
            if (i-1) in reserve: # 도난 당한 번호의 앞 번호가 여벌이 있을 경우
                reserve.remove(i-1)
                lost.remove(i)
                answer+=1 # 수업 참여 +1
            elif (i+1) in reserve: # 도난 당한 번호의 뒷 번호가 여벌이 있을 경우
                reserve.remove(i+1)
                lost.remove(i)
                answer+=1 # 수업 참여 +1

    return answer

가장 높은 비율의 정답 풀이

  • 간결한 것에 감탄....리뷰해보면
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: # f가 도난 당했다면
            _lost.remove(f) # 여벌없이 도난 당한 리스트에서 제거
        elif b in _lost: # b가 도난 당했다면
            _lost.remove(b) # 여벌없이 도난 당한 리스트에서 제거
    return n - len(_lost) # 총 학생수에서 여벌없이 도난당한 사람 리스트 빼서 수업 참여 인원 산출

좋은 웹페이지 즐겨찾기