프로그래머스 코딩테스트 연습

ddalkigum·2020년 12월 13일
1

알고리즘

목록 보기
14/15
post-thumbnail

오늘도 배운게 많습니다...
슬라이싱에 보는 새로운 시각을 얻엇고,
알고 있엇지만, 응용해서 사용하지 못했던 함수도 다시 한번 공부하게되었고,
역시 알고 있는 것 만으로는 부족하다는 걸 느꼇습니다

모의고사

문제

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

풀이

def solution(answers):
    answer = []
    a_answer = [1,2,3,4,5]
    b_answer = [2,1,2,3,2,4,2,5]
    c_answer = [3,3,1,1,2,2,4,4,5,5]
    a_count = 0
    b_count = 0
    c_count = 0
    for i in range(len(answers)):
        if answers[i] == a_answer[i%len(a_answer)]:
            a_count += 1
        if answers[i] == b_answer[i%len(b_answer)]:
            b_count += 1
        if answers[i] == c_answer[i%len(c_answer)]:
            c_count += 1
    max_number = max(a_count, b_count, c_count)
    if max_number == a_count:
        answer.append(1)
    if max_number == b_count:
        answer.append(2)
    if max_number == c_count:
        answer.append(3)
    return answer

간단한 방법이 있지 않을까 해서 많이 고민했던 문제 지저분해 보여서
깔끔하게 정리하고 싶었는데, 끝내 못했다

하나하나 확인하면서 풀어야 하는 문제
이게 맞나? 싶을정도로 전부다 적어줘야 하는 문제였다

깔끔한 풀이

def solution(answers):
    pattern1 = [1,2,3,4,5]
    pattern2 = [2,1,2,3,2,4,2,5]
    pattern3 = [3,3,1,1,2,2,4,4,5,5]
    score = [0, 0, 0]
    result = []

    for idx, answer in enumerate(answers):
        if answer == pattern1[idx%len(pattern1)]:
            score[0] += 1
        if answer == pattern2[idx%len(pattern2)]:
            score[1] += 1
        if answer == pattern3[idx%len(pattern3)]:
            score[2] += 1

    for idx, s in enumerate(score):
        if s == max(score):
            result.append(idx+1)

    return result

정답확인 해보면 제일 처음에 나오는 답안인데,
나랑 다른점은 enumulate를 사용해서 튜플형태를 만들어 준것

평소 알고 있는 함수 인데도, 문제에 활용을 못햇다


같은 숫자는 싫어

문제

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면,

arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.
배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.

풀이

def solution(arr):
    from collections import deque
    answer = []
    lists = []
    deq = deque(arr)
    while deq:
        number = deq.popleft()
        if len(deq) ==0:
            if len(answer) == 0:
                answer.append(number)
            elif answer[-1] == number:
                pass  
            else:
                answer.append(number)
        elif deq[0] == number:
            pass
        else:
            answer.append(number)
    return answer

조심할 부분은 answers의 길이가 0일 경우

굉장히 깔끔한 풀이

def no_continuous(s):
    a = []
    for i in s:
        if a[-1:] == [i]: continue
        a.append(i)
    return a

역시 알고리즘 고수들은 생각부터가 남다르다

슬라이싱을 이용한 풀이법으로 이 풀이법을 보고
슬라이싱을 이렇게도 쓸수 있구나... 생각이 들었다

a[-1:]을 하게되면 빈 배열이더라도 에러가 안뜬다

슬라이싱을 배웠긴 했는데,,, 배열이 0일때도 쓸수 잇구나..
하나 더 배웟다


위 두 문제 외에도 수박수박수, 두 정수 사이의 합, 나누어 떨어지는 숫자 배열
세문제를 풀었는데 이 세문제는.. 안 올려도 될것같은 문제라서

후기

개인적으로 프로그래머스 사이트가 좋은 이유중 하나는
정답을 맞춘후 다른 사람의 풀이를 볼 수 있다는 것에 있다

역시나 다른 방법이 있엇구나,,,
아... 이걸 이렇게 쓰면 되는구나

뭐 여러가지 생각을 하게 해주는 풀이 법들이 많다는 걸 느낀다.

나도 제일 첫페이지에 내 풀이를 올려보고 싶다
라는 도전 욕심도 생기고

좋은 사이트인 것 같다

파이썬의 여러 내장 함수들을 찾아보게 되고, 사용해보고
다음번에 함수를 사용해서 풀어보고,
그러면서 점점 풀이 방법이 다양해지고 있다는게 느껴진다

근데 아직... BFS 랑 DFS는 손도 못대겟다

profile
딸기검 -본캐🐒 , 김준형 - 현실 본캐 🐒

0개의 댓글