프로그래머스 level 1 (2)

coguma·2021년 8월 29일
0

CodingPython

목록 보기
4/7

크레인 인형뽑기 게임

문제 출처: https://programmers.co.kr/learn/courses/30/lessons/64061
def solution(board, moves):
    col = list(0 for i in range(len(board)))
    result = []
    total = []

    for m in moves:
        doll = 0
        while doll == 0 and col[m-1] < len(board):
            doll = board[col[m-1]][m-1]
            col[m-1] += 1

        if doll != 0:
            result.append(doll)
            total.append(doll)

        result = result[:-2] if len(result) >= 2 and result[-1] == result[-2] else result

    return (len(total)-len(result))
col는 열마다 가장 위에 있는 인형이 몇 번째 행에 위치하는지 알기 위한 리스트이다. total은 집어 올린 인형을 모두 나타낸 리스트이고, result는 집어 올린 인형 중 연속해서 쌓여 없어진 인형을 제외한 리스트이다. 0은 빈칸을 의미하므로 0이 아닌 수가 나올 때까지 탐색하고 0이 아닌 수가 나오면 result와 total에 이를 추가한다. 한 번 움직일 때마다 result의 마지막 두 요소가 같은 인형인지 확인하는 과정을 거친다. 모든 과정이 끝나면 사라진 인형을 제외한 나머지 인형의 개수를 리턴한다. 이 문제는 stack을 활용하여 풀 수도 있다.

위클리 챌린지 2주차

문제 출처: https://programmers.co.kr/learn/courses/30/lessons/83201
def solution(scores):
    answer = ''
    
    for index, score in enumerate(list(map(list, zip(*scores)))):
        if (max(score) == score[index] or min(score) == score[index]) 
        and score.count(score[index]) == 1:
            del score[index]
            
        avg = sum(score) / len(score)
        if avg >= 90:
            answer += 'A'
        elif 80 <= avg < 90:
            answer += 'B'
        elif 70 <= avg < 80:
            answer += 'C'
        elif 50 <= avg < 70:
            answer += 'D'
        else:
            answer += 'F'
            
    return answer
n번 학생에게 평가한 모든 점수를 같은 리스트에 담기 위해 행렬을 전치하였다. 학생들이 자기 자신을 평가한 점수가 유일한 최고점 또는 유일한 최저점이라면 그 점수를 제외하고 평균을 구해야 하므로, 조건에 충족하면 해당 점수를 리스트에서 제거하였다.

실패율

문제 출처: https://programmers.co.kr/learn/courses/30/lessons/42889
import collections
def solution(N, stages):
    rates = {}
    answer = []
    count = 0
    
    for i in range(N):
        if count < len(stages):
            rates[i+1] = stages.count(i+1)/(len(stages)-count)
        else:
            rates[i+1] = 0
        count += stages.count(i+1)
    
    sorted_answer = sorted(rates.items(), key = lambda x: x[1], reverse = True)
    
    for key, value in sorted_answer:
        answer.append(key)
        
    return answer
rates는 스테이지별로 실패율을 담는 dict이다. 실패율이 높은 순으로 정렬하기 위해 sorted와 lambda를 활용하였다. 이후 정렬된 dict의 key값만 리턴하면 된다.

3진법 뒤집기

문제 출처: https://programmers.co.kr/learn/courses/30/lessons/68935
def solution(n):
    result = ''
    
    while n > 0:
        n, mod = divmod(n, 3)
        result += str(mod)
        
    return int(result, 3)
10진법에서 n진수로 변환할 때는 divmod()를, n진수에서 10진수로 변환할 때는 int()를 활용한다.

비밀 지도

문제 출처: https://programmers.co.kr/learn/courses/30/lessons/17681
def solution(n, arr1, arr2):
    result = []
    for i in range(n):
        bin_str = str(bin(arr1[i] | arr2[i]))
        bin_str = bin_str.replace("0b","")
        if len(bin_str) < n:
            bin_str = '0'*(n-len(bin_str)) + bin_str
        bin_str = bin_str.replace("1","#")
        bin_str = bin_str.replace("0"," ")
        result.append(bin_str)
        
    return result
두 지도 중 어느 하나라도 벽(1)인 부분은 전체 지도에서도 벽이므로, 비트 연산 중 | 연산자를 사용한다. 그 다음 문자열로 전환하여 #과 공백으로 이루어진 문자열을 리스트에 추가하고, 리스트를 리턴한다.

다트 게임

문제 출처: https://programmers.co.kr/learn/courses/30/lessons/17682
def solution(dartResult):
    total = []
    answer = 0
    num = ''

    for i in range(len(dartResult)):
        if dartResult[i].isdecimal():
            num += dartResult[i]

        if dartResult[i] == 'S':
            answer += int(num)**1
            total.append(answer)
            num = ''

        elif dartResult[i] == 'D':
            answer += int(num)**2
            total.append(answer)
            num = ''

        elif dartResult[i] == 'T':
            answer += int(num)**3
            total.append(answer)
            num = ''

        elif dartResult[i] == '*':
            total[len(total)-1] *= 2
            if len(total) >= 2:
                total[len(total)-2] *= 2

        elif dartResult[i] == '#':
            total[len(total)-1] *= (-1)
        answer = 0
    
    return sum(total)
리스트의 요소가 숫자인 경우 num에 추가하고, S, D, T 중 하나면 num을 계산하여 리스트에 추가한다. *인 경우, 첫 번째 기회인지 아닌지 확인하여 점수를 계산한다.
profile
코딩하는 고구마

0개의 댓글

관련 채용 정보