본문 바로가기

CodingTest/Programmers

[ 프로그래머스 ] 모의고사

/  제출 1  /

def solution(answers):
    result = []
    n = len(answers)
    first = [1,2,3,4,5]
    second = [2,1,2,3,2,4,2,5]
    third = [3,3,1,1,2,2,4,4,5,5]
    students = [first, second, third]
    for student in students:
        score = 0
        # answer이 학생찍는 기본배열보다 작을 때
        if n < len(student):
            for a, s in zip(answers, student[:n]):
                if a == s:
                    score += 1
        # 학생 찍는 기본 배열보다 answer이 많을 때
        else:
            # 기본 배열 늘려주기
            student = student*(n//len(student))
            remain = n%len(student)
            if remain != 0:
                student += student[:remain]
            for a, s in zip(answers, student):
                if a == s:
                    score += 1
        result.append(score)
        
    answer = []
    best = 0
    for i in range(3):
        if best <= result[i]:
            answer.append(i+1)
            best = result[i]
           
    return answer
채점 결과
정확성: 50.0
합계: 50.0 / 100.0
 
1,5,6,7,8,11,14 실패
흐..으으ㅡ.... 이렇게 테스트케이스에서 모두 성공하고 제출 시에 2개 이상에서 실패하면 진짜 마음이 미어집니다...
속상해서.. 더 꼼꼼하지 못했나.. 어떤 예외를 놓쳐가지고.. 왜 마음이 급해가지고.. 하면서요.
다시 풀어봅시다.

/  제출 2  /

def solution(answers):
    result = []
    n = len(answers)
    first = [1,2,3,4,5]
    second = [2,1,2,3,2,4,2,5]
    third = [3,3,1,1,2,2,4,4,5,5]
    students = [first, second, third]
    for student in students:
        score = 0
        # answer이 학생찍는 기본배열보다 작을 때
        if n < len(student):
            for a, s in zip(answers, student[:n]):
                if a == s:
                    score += 1
        # 학생 찍는 기본 배열보다 answer이 많을 때
        else:
            # 기본 배열 늘려주기
            student = student*(n//len(student))
            remain = n%len(student)
            if remain != 0:
                student.extend(student[:remain])
            print(student)
            for a, s in zip(answers, student):
                if a == s:
                    score += 1
        result.append(score)
    answer = []
    best = max(result)
    for i in range(3):
        if best == result[i]:
            answer.append(i+1)
           
    return answer
채점 결과
정확성: 100.0
합계: 100.0 / 100.0

수정사항 1 .

 

    for i in range(3):
        if best <= result[i]:
            answer.append(i+1)
            best = result[i]

우선 마지막 부분에서 카운팅을 정말 이상하게 했습니다. 한 번 answer에 appedn되면 나올 수 없게 되었습니다. 그래서 제일 큰 값이 생겨도 이전 작은 값이 answer에 남아있게 됩니다.

 

    answer = []
    best = max(result)
    for i in range(3):
        if best == result[i]:
            answer.append(i+1)

최고값을 찾아서 해당 값에 맞는 학생을 넣습니다.

해당 문제 카테고리가 완전탐색에, 학생 수도 3명 밖에 되지 않아 요렇게 작성합니다.

 

 

 

수정사항 2. 

 else:
            # 기본 배열 늘려주기
            student = student*(n//len(student))
            remain = n%len(student)
            if remain != 0:
                student.extend(student[:remain])
            print(student)
            for a, s in zip(answers, student):
                if a == s:
                    score += 1

기본 배열을 늘려주는 부분도 extend() 를 써서 다시 작성했습니다. 리스트와 리스트를 더하는 함수입니다. 함수명이 직관적이어서 코드 의미를 알기 더 좋아보여 변경했습니다.

 


/  다른 분들 풀이  /

from itertools import cycle

def solution(answers):
    giveups = [
        cycle([1,2,3,4,5]),
        cycle([2,1,2,3,2,4,2,5]),
        cycle([3,3,1,1,2,2,4,4,5,5]),
    ]
    scores = [0, 0, 0]
    for num in answers:
        for i in range(3):
            if next(giveups[i]) == num:
                scores[i] += 1
    highest = max(scores)

    return [i + 1 for i, v in enumerate(scores) if v == highest]

처음 보는 내장함수여서 관심 있게 살펴봤는데 전체적으로 코드가 참 좋습니다.

 

우선 cycle() 함수는 list요소를 무한순회하며 연장 가능한 함수입니다.
주어지는 인자값이 너무 크면 공간을 많이 차지할 수 있으니 그 점을 주의하라고 제시되어 있습니다.

https://docs.python.org/3/library/itertools.html#itertools.cycle

 

itertools — Functions creating iterators for efficient looping — Python 3.10.5 documentation

itertools — Functions creating iterators for efficient looping This module implements a number of iterator building blocks inspired by constructs from APL, Haskell, and SML. Each has been recast in a form suitable for Python. The module standardizes a co

docs.python.org

https://www.geeksforgeeks.org/python-itertools-cycle/

 

Python - Itertools.cycle() - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org