[Programmers] 크레인 인형뽑기 게임 / 완주하지 못한 선수 / 모의고사 / K번째 수 (python)

yourmean·2021년 1월 26일
2

Algorithm - Programmers

목록 보기
1/13
post-thumbnail

🌴 크레인 인형뽑기 게임

문제 링크

해결 전략

board : 게임 화면의 격자의 상태가 담긴 2차원 배열
moves : 인형을 집기 위해 크레인을 작동시킨 위치가 담긴 배열

  1. move에 맞춰 바구니(basket)에 인형을 순서대로 집어넣음
  2. 바구니에 인형을 집어넣은 후 해당 칸은 0으로 변경
  3. 바구니에 인형이 2개 이상 & 최근에 들어온 인형 2개가 같은 종류이면
  4. 인형 개수 세고(answer+=2), 해당 인형 2개 바구니에서 삭제

Source Code

def solution(board, moves):
    basket = []
    answer = 0
    for m in moves:
        for i in range(len(board)):
            if board[i][m-1]!=0:
                basket.append(board[i][m-1])
                board[i][m-1] = 0
                if len(basket)>=2 and  basket[-2] == basket[-1]:
                    answer +=2
                    del basket[-2:]
                break
    return answer

알고리즘 풀 때 for문을 사용하면 비효율적으로 코드를 짠 것 같은 기분이 든다 😂



🌴 완주하지 못한 선수

문제 링크

해결 전략

participant : 마라톤에 참여한 선수들의 이름이 담긴 배열
completion : 완주한 선수들의 이름이 담긴 배열

  1. participant 중에서 completion에 포함되지 않는 이름 find
  2. 동명이인 고려 > Counter
  3. 완주하지 못한 선수 이름 > key
  4. list(선수이름)[0] return

Source Code

import collections

def solution(participant, completion):
    ans = list((collections.Counter(participant)-collections.Counter(completion)).keys())[0]
    return ans


풀어서 써보면

import collections

def solution(participant, completion):
    ans = collections.Counter(participant)-collections.Counter(completion)
    ans = ans.keys()
    ans = list(ans)[0]
    return ans

어쩌다 보니 엄청 간단하게 끝난 문제 (뿌듯^___^)


🌴 모의고사

문제 링크

해결 전략

answers : 1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열

  1. 1,2,3번 수포자 각각이 맞은 문제 담을 score=[0,0,0]
  2. answers(정답)를 돌면서 맞을 때마다 score+1
  3. 이 때, %len(ans1)으로 답안 패턴이 끊기지 않도록 해 주기
  4. max(score)만큼 문제를 맞힌 사람 번호 ans에 추가

Source Code

def solution(answers):
    ans1= [1,2,3,4,5]
    ans2= [2,1,2,3,2,4,2,5]
    ans3= [3,3,1,1,2,2,4,4,5,5]
    score=[0,0,0]
    ans=[]

    for i in range(len(answers)):
        if ans1[i%len(ans1)]==answers[i]:
            score[0]+=1
        if ans2[i%len(ans2)]==answers[i]:
            score[1]+=1
        if ans3[i%len(ans3)]==answers[i]:
            score[2]+=1
            
    for i in range(3):
        if score[i]==max(score):
            ans.append(i+1)

    return ans

%len(ans1) 고민하는 데 시간이 오래 걸렸다
다른 사람들 풀이에 enumerate가 많이 등장하던데
조만간 정리해봐야겠다


🌴 K번째 수

문제 링크

해결 전략

array : 배열
commands : [i, j, k]를 원소로 가진 2차원 배열

  1. commands[n]에 따라 i, j, k를 매핑
  2. array에서 i번째 숫자부터 j번째 숫자까지 자르고 sorting
  3. k번째에 있는 수를 ans에 추가하고, 이 과정을 반복

Initial Source Code

def solution(array, commands):
    ans=[]
    for n in range(len(commands)):
        i,j,k = commands[n][0], commands[n][1], commands[n][2]
        ans.append(sorted(array[i-1:j])[k-1])
    return ans

Final Source Code

i,j,k=[1,2,3] 과 같이 바로 매핑 가능하다..! 처음 알았음
살짝 바꾼 최종 코드는 아래와 같다.

def solution(array, commands):
    ans=[]
    for c in commands:
        i,j,k = c
        ans.append(sorted(array[i-1:j])[k-1])
    return ans
profile
𝐼 𝑒𝑖𝑡ℎ𝑒𝑟 𝑤𝑖𝑛 𝑜𝑟 𝑙𝑒𝑎𝑟𝑛 💪🏻

0개의 댓글