Algorithm/프로그래머스

세무민의 코딩일기 : 프로그래머스 모의고사 문제 풀기

세기루민 2021. 2. 14. 14:05
728x90

이번에 포스팅할 문제는 모의고사 문제!

위의 조건이 주어졌을 때 조건에

정답이 가장 많이 일치하는 사람을 선택해주면 됩니다


위에서 1번 수포자의 반복되는 방식이 

1 -> 2 -> 3 -> 4 -> 5 -> 1 ->..............

하나씩 증가하는 방식입니다. 

2번 수포자의 반복되는 방식은 

2 -> 1 -> 2 -> 3 - > 2 -> 4 -> 2 - > 5 -> 2 -> ..............

2를 빼고 보면 1 -> 3 -> 4 -> 5

일반 순서에서 2를 빼고 앞뒤로 하나씩 넣어준 방식

3번 수포자의 방식은 

3 -> 3- > 1 -> 1 -> 2 -> 2 -> 4 -> 4 -> 5 -> 5 -> ...

2개씩 나열하며 3번은 맨 앞에 나열한 방식!

근데 사실 방식을 아무리 알더라도 이렇게 문제를 푼다면?? 생각보다 많은 시간이 소요되겠죠?...


from itertools import cycle
def solution(answer):
    math1 = [1, 2, 3, 4, 5]
    math2 = [2, 1, 2, 3, 2, 4, 2, 5]
    math3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    check = [0] * 3
    result = []

#     import math 
#     math1 = math1 * math.ceil(len(answers) / len(math1))
#     math2 = math2 * math.ceil(len(answers) / len(math2))
#     math3 = math3 * math.ceil(len(answers) / len(math3))


#     for i in range(len(answers)):

#         if answers[i] == math1[i]:
#             check[0] += 1
#             maxSize = False

#         if answers[i] == math2[i]:
#             check[1] += 1
#             maxSize = False

#         if answers[i] == math3[i]:
#             check[2] += 1
#             maxSize = False

#         if check[0] == check[1] and check[1] == check[2]:
#             maxSize = True


#     maxSum = 0 
#     for i in range(len(check)):
#         try:
#             if maxSize == True:
#                 result = [1, 2, 3]
#                 break

#             if check[i] < check[i+1]:
#                 maxSum = i
#         except IndexError:
#             continue

#     if len(result) == 0:
#         result.append(maxSum + 1)    
    
    for number1, number2, number3, answer in zip(cycle(math1),cycle(math2),cycle(math3), answer):
        if number1 == answer:
            check[0] += 1

        if number2 == answer:
            check[1] += 1

        if number3 == answer:
            check[2] += 1

    maxSize = max(check)
    for i in range(len(check)):
        if check[i] == maxSize:
            print(check[i])
            result.append(i+1)
    
    
    return result

원래는 주석 친 방식처럼 구하려고 했습니다. 

내가 입력한 값을 찍는 방식에 따라서 Check를 한 후 

만약에 check 카운트의 수가 동일하거나 True라면 모든 사람을 출력하고 

그렇지 않다면 가장 큰 사람을 출력하는 방식을 하려고 했으나....

이러한 방법은 리스트의 크기가 커지는 경우에 생각보다 비 효율적이여서 

파이썬에서 사용할 수 있는 내장함수인 zip과 cycle을 이용하게 되었습니다. 

cycle은 말 그대로 무한 반복을 할 수 있습니다. 

즉 위에 보면 math1을 1, 2, 3, 4, ,5 총 5개의 크기만 존재하지만 

5개보다 더 많은양이 들어온다면 해당 리스트를 크기만큼 반복하게 됩니다.

zip은 동일한 개수로 이루어진 자료형을 묶어주는 역할을 합니다.

따라서 위에서 리스트의 크기가 해당 math와 일치하지 않더라도 크기에 알맞게 반복문을 돌려서 

해당 결과를 도출할 수 있습니다.


 다음에는 더 좋은 포스팅으로 찾아오겠습니다! 

최근에 알고리즘 공부를 소홀히 하는데.....

좀 더 열심히 해서 포스팅을 자주하겠습니다 ㅠㅠ 

 

 

728x90