[프로그래머스/Python] 체육복

2.so_j·2022년 9월 6일
0

문제

제한사항


문제 풀이

파이썬으로 알고리즘 문제를 푼지 이틀 된 사람의 풀이입니다
좋은 코드가 아닐 수 있음을 미리 밝힙니다 ^^*

첫 시도

는 사실 제한 사항을 제대로 이해하지 않은 채 풀게됩니다

lost 배열의 값보다 1이 작거나 1이 크면
reserve에서 해당되는 값을 지워주는 방식으로 접근을 했고
빌려주는 조건에 해당될 때마다, count하는 변수의 값도 1씩 증가시켜주었습니다

def solution(n, lost, reserve):
    resultCount = 0
    
    for i in lost:
        for k in reserve:
            if ((i-1 == k) or (i+1 == k)):
                resultCount += 1
                reserve.remove(k)
                break
        
    answer = n - (len(lost) - resultCount)
    return answer

정답률 65%의 가슴 아픈 코드입니다 . . ..

안맞는 케이스들이 너무 많이 보여서
제한 사항을 꼼꼼하게 읽게 되었습니다

처음부터 잘 읽으면 얼마나 좋을까요 . . ?

두 번째 시도

잘 봐야할 부분은 "중복되는 번호는 없습니다." 부분과
"여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다." 부분인데요

첫 번째 부분을 만족 시키기 위해서
중복 되는 원소를 없애주는 set함수를 사용하였고,

두 번째 부분을 만족 시키기 위해서
lost배열과 reserve배열의 차집합을 구했습니다

def solution(n, lost, reserve):
    resultCount = 0
    lostUniq = set(lost) - set(reserve)
    reserveUniq = set(reserve) - set(lost)
    
    for i in lostUniq:
        for k in reserveUniq:
            if ((i-1 == k) or (i+1 == k)):
                resultCount += 1
                reserveUniq.remove(k)
                break
        
    answer = n - (len(lostUniq) - resultCount)
    return answer

앞으로는 틀린 케이스가 있을 때마다 제한사항을 정말 꼼꼼하게 봐야겠음을 다짐했던 문제,,


디벨롭하기

저는 해당되는 값을 찾기위해서 반복문을 한 번 더 써줬는데 그럴 필요가 없다는 사실 .!
존재 확인 연산자라고 칭하는 친구를 사용해주었습니다

def solution(n, lost, reserve):
    resultCount = 0
    lostUniq = set(lost) - set(reserve)
    reserveUniq = set(reserve) - set(lost)
    
    for i in lostUniq:
        if i-1 in reserveUniq:
            resultCount += 1
            reserveUniq.remove(i-1)
        elif i+1 in reserveUniq:
            resultCount += 1
            reserveUniq.remove(i+1)
        
    answer = n - (len(lostUniq) - resultCount)
    return answer
profile
싱글코어 두뇌의 개발자 도전기

0개의 댓글