CS/알고리즘 문제풀이

프로그래머스 LV1 - 모의고사

AI쟁이J 2022. 8. 14. 22:29

전에 한번 오지게 도전했다가 실패했던 문제. 하지만 오늘 문득 오? 싶은 해결 방안이 떠올랐고 그 방법으로 풀이 성공

def solution(answers):
    
    ans = [0] * 4
    
    a = [1,2,3,4,5]
    b = [2,1,2,3,2,4,2,5]
    c = [3,3,1,1,2,2,4,4,5,5]
    
    first = a * (len(answers)//5) + a[:(len(answers)%5)]
    second = b * (len(answers)//8) + b[:(len(answers)%8)]
    third = c * (len(answers)//10) + c[:(len(answers)%10)]
    
    correct1 = [x-y for x,y in zip(first,answers)]
    correct2 = [x-y for x,y in zip(second,answers)]
    correct3 = [x-y for x,y in zip(third,answers)]
    
    ans[1] = correct1.count(0)
    ans[2] = correct2.count(0)
    ans[3] = correct3.count(0)
    
    return list(filter(lambda x: ans[x] == max(ans), range(len(ans))))

먼저 ans[0] * 4 로 몇 개씩 맞췄는지 넣을 빈 행 생성 (왜 4개인지는 추후 서술)

다른 사람들의 접근 방식과 똑같이 패턴을 저장. first, second, third 여기까진 누구나 했다

 

그 다음이 여러 시행착오 끝에 나온 방법으로 일단 처음의 코드는 for 문이 지나치게 사용이 되었고 코드가 굉장히 보기 더러웠음. 그래서 따로 리스트 컴프리헨션(list comprehension)을 통해 세 명의 정답 수를 짜보자고 판단, 파이써닉하게 깔끔하게 for문 사용 ㅋ.ㅋ

 

이 리스트는 correct1을 통해 보면

zip(first, answers) 를 통해 앞서 만든 패턴과 정답들을 묶는다. 

예시 1 기준으로 [(1,1) (2,2) (3,3) (4,4) (5,5)] 가 나온다. 그리고 이 원소들을 [x-y for x,y in zip(first,answers] 하면

[0,0,0,0,0] 이다. 0은 수포자가 쓴 답과 실제 정답의 차이가 0이라는 뜻. 즉, 1,2,-1,-2 가 나오는 것은 관심이 없다. 0이 나오면 정답.

그래서 ans 리스트에 correct들의 0 카운트 수를 저장한다. ans[0] 에는 0이 들어가 있는데 이건 인덱스를 수포자 1,2,3으로 쓰기 위한 더미 변수다.

그래서 ans = [0, n1, n2, n3] 으로 저장이 되는데 여기서 이제 마지막 filter()를 이용해 람다식으로

ans 중에서 max(ans)와 값이 같은 인덱스를 리스트로 뽑아낸다. 그러면 정답

 

근데 이거 정리하면서 생각해 봤는데 앞에 더미로 0 넣은거 틀렸다. 걍 [0] * 3 한다음 그 인덱스 값 + 1을 return하도록 했어야 한다. 왜냐면 만약 수포자 1,2,3 모두 0개 맞춰서 ans = [0,0,0,0] 인 테스트 케이스 있었으면 거기서 [1,2,3,4] 도출해서 틀렸을거다. 역시 정공법이 답이다. 꼼수 부리다간 틀릴 수 있다. 깨달았고 통과 했으니 다행