[프로그래머스] PCCP 모의고사 1회 - 체육 대회 [Python]

원준·2023년 4월 25일
0

코딩 테스트

목록 보기
6/18

PCPP 모의고사 1회 - 체육 대회를 풀어봤다.
이벤에도 처음 시도에서 정답을 맞출 수는 없었지만, 다른 방법을 알아본 후 곧바로 정답을 맞출 수 있었다.

1. 문제 설명

2. 제한 사항 및 입출력 예)

3. 코드

1. 처음 시도 한 코드

  • 처음 시도 했던 코드다.
  • 아쉽게도 실패했던 코드인데, 하나씩 뜯어봤을 때 중복된 수가 있을때 원하는 위치를 들고 오지 못하여 실패 한 듯하다.
# 1번째 시도 코드
def solution(ability):
    answer = 0
    
    childe = {}
    
    length = len(ability[0]) #과목 수를 반환한다.
    for n in range(length): #가장 먼저 최고점을 가진 과목의 기준점을 정한다.
        max_score = 0
        for key, value in enumerate(ability): # 중복되지 않게 학생들의 점수를 dic 변환한다.
            childe[key] = value
        for v in range(length): # 기준을 포함한 나머지 들을 찾는다.
            childe_list= []
            for score in childe.values():
                childe_list.append(score[v-n])
            max_score += max(childe_list) # 해당 기준의 최대값을 찾고 더한다.
            childe[childe_list.index(max(childe_list))] = [ -1 for i in childe[childe_list.index(max(childe_list))]] # 해당 기준의 최대값을 가진 학생을 더이상 포함시키지 않기 위해 -1로 전부 변환한다.
        answer = max(answer, max_score)

    return answer

2. 정답 코드

  • 두번째로 시도 한 코드.
  • 다른 방법을 찾아 보면서 경우의 수에 따라서 수를 더하는 방식으로 적용했다.
  • itertools 모듈 사용
# 정답 코드
import itertools as it_tools #itertools 모듈을 불러온다.
def solution(ability):
    answer = 0
    
    ab_list = it_tools.permutations(ability, len(ability[0]))
    # permutations(리스트, 숫자)
    # 리스트안에서 숫자 만큼만 나오도록 경우의 수를 만들어 반환한다.
    
    for child_list in list(ab_list): # 반환한 경우의 수를 list로 변경한다.
        total = 0
        for i in range(len(child_list)):
            total += child_list[i][i]
        answer = max(answer, total)

    return answer

4. 느낀 점

  • 최대한 모듈을 사용안하려고 했지만, 경우의 수를 전부 구하는 좋은 모듈이 있어 사용해 해결했다.
  • 처음 방법으로는 많은 경우의 수에 따라 max의 값을 구하는 거라 원하는 위치가 아닌 앞쪽 수를 가져오다 보니 정답에는 가깝지 않았다.
  • 두번째 코드는 모든 경우의 수를 찾아서 더하다 보니 계산해야할 수가 많다면 오래 걸린다는 단점이 있다.
  • 조금 난이도가 낮은 것으로 연습하고 PCCP를 다시 도전해야겠다.
    • 아직 부족한것이 많다.
profile
공부해보자

0개의 댓글