자료구조 및 알고리즘/프로그래머스

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

viamemine 2024. 6. 13. 17:39
728x90
반응형

문제: https://school.programmers.co.kr/learn/courses/30/lessons/42840

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

 

오늘의 문제는 level 1문제입니다. 

1번 수포자, 2번 수포자, 3번 수포자는 찍는 방식이 반복적이며

가장 정답을 많이 맞춘 사람을 배열에 담아 return하는 문제입니다.

 

문제는 어렵지 않습니다.

다음과 같은 방법으로 문제를 해결하면 됩니다.

 

1. answer와 각 사람의 답변을 매칭하여 맞았을 경우 score +1

2. 가장 많이 맞춘 사람 구해서 배열에 넣고

3. 배열(정답) 출력 ! 

 

여기서 ! 반복되는 문자열을 구하는 방법을 알고 가면 좋겠습니다. 최근 코테 준비를 하면서, 또 실제 코딩 테스트에서도 반복 문자열에 관련된 문제를 만났기 때문입니다 !

 


문자열 길이만큼 반복 (문자열 자르기)

def repeat(string_to_repeat, length):
    multiple = int(length / len(string_to_repeat) + 1)
    repeated_string = string_to_repeat * multiple
    return repeated_string[:length]


r = repeat("txt", 10)
print(r)

 

 

→ 문자열 반복 출력 

핵심 아이디어는 아래의 코드와 같이

인덱스를 i%len()로 계산하여 pattern을 순환하는 것입니다 !

     for i, answer in enumerate(answers):
        for j, pattern in enumerate(patterns):
            if answer == pattern[i%len(pattern)]: # ***

 


 

나의 풀이   ... 

def solution(answers):
    answer = []

    one = [1, 2, 3, 4, 5]  # 5
    two = [2, 1, 2, 3, 2, 4, 2, 5]  # 8
    three = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]  # 10

    # answer와 각 사람의 답변 길이를 맞춰주기
    one = one * (len(answers) // len(one)) + one[:len(answers) % len(one)]
    two = two * (len(answers) // len(two)) + two[:len(answers) % len(two)]
    three = three * (len(answers) // len(three)) + three[:len(answers) % len(three)]

    # 각 사람이 얼마나 답변을 맞췄는지 확인하기
    score = [0] * 3

    for idx in range(len(answers)):
        if answers[idx] == one[idx]:
            score[0] += 1
        if answers[idx] == two[idx]:
            score[1] += 1
        if answers[idx] == three[idx]:
            score[2] += 1

    # 가장 많이 맞춘 사람 구하기
    for idx in range(len(score)):
        if score[idx] == max(score):
            answer.append(idx + 1)

    return answer

 

 

💥 Refactoring한 정답 풀이

def solution(answers):
	patterns = [
        [1, 2, 3, 4, 5], # 5
        [2, 1, 2, 3, 2, 4, 2, 5], # 8
        [3, 3, 1, 1, 2, 2, 4, 4, 5, 5] # 8
    ]

    scores = [0] * 3

    for i, answer in enumerate(answers):
        for j, pattern in enumerate(patterns):
            if answer == pattern[i%len(pattern)]: # ***
                scores[j] += 1

    highest_scores = []
    for idx, score in enumerate(scores):
        if score == max(scores):
            highest_scores.append(idx+1)

    return highest_scores
728x90