본문 바로가기
Algorithm

[프로그래머스] 알고리즘 난이도 중/중상 12문제 (Python) -5

by Baest 2022. 2. 20.

 

1) 예산

https://programmers.co.kr/learn/courses/30/lessons/12982

 

코딩테스트 연습 - 예산

S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는

programmers.co.kr

def solution(d, budget):
    answer = 0
    
    for i in sorted(d):
        budget -= i # budget에서 d의 작은수부터 빼줌
        
        if budget < 0: break # 0보다 작으면 break
        answer += 1
        
    return answer

 

 

2) 최대공약수와 최소공배수

https://programmers.co.kr/learn/courses/30/lessons/12940

 

코딩테스트 연습 - 최대공약수와 최소공배수

두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의

programmers.co.kr

 

- for문 사용

def solution(n, m):
    answer = []
    for i in range(min(n,m), 0, -1):   # n,m 중 작은 수 부터 0까지 1까지 -1하면서 반복
        if n % i == 0 and m % i == 0:
            answer.append(i)
            break
    
    for i in range(max(n,m), (n*m)+1): # n,m 중 큰 수 부터 n*m한 숫자까지 반복
        if i % n == 0 and i % m == 0:
            answer.append(i)
            break
            
    return answer

 

- math 함수 이용

최신버전인 파이썬 4에서 lcm 가능하다고 함

 

 

3) K번째수

https://programmers.co.kr/learn/courses/30/lessons/42748 

 

코딩테스트 연습 - K번째수

[1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [1, 7, 3]] [5, 6, 3]

programmers.co.kr

 

def solution(array, commands):
    answer = []

    for i in range(len(commands)):
        start = commands[i][0]-1 # i (인덱스가 아니라 순서니까 -1 해줌)
        end = commands[i][1]	 # j
        idx = commands[i][2]-1   # k (인덱스가 아니라 순서니까 -1 해줌)
        temp = array[start:end]
        temp.sort()
        answer.append(temp[idx])
        
    return answer

 

 

4) 나머지가 1이 되는 수 찾기

https://programmers.co.kr/learn/courses/30/lessons/87389

 

코딩테스트 연습 - 나머지가 1이 되는 수 찾기

자연수 n이 매개변수로 주어집니다. n을 x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다. 제한사항 입

programmers.co.kr

def solution(n):
    for i in range(1, n+1): # n이 10일 경우 1부터 10까지
        if(n % i == 1):
            return i

 

 

5) 소수 찾기

https://programmers.co.kr/learn/courses/30/lessons/12921

 

코딩테스트 연습 - 소수 찾기

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요. 소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다. (1은 소수가 아닙니다.) 제한 조건 n은 2이상

programmers.co.kr

- 1차 시도: 런타임 에러 발생 코드

def solution(n):
    answer = 0

    for n in range(2, n+1):
        for i in range(2, n):
            if n % i == 0:
                break
        else: 
            answer += 1
    
    return answer

 

- 2차 시도

 

 

6) 실패율

https://programmers.co.kr/learn/courses/30/lessons/42889

 

코딩테스트 연습 - 실패율

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스

programmers.co.kr

 

- 1차 시도

 

 

7) 체육복

https://programmers.co.kr/learn/courses/30/lessons/42862

 

코딩테스트 연습 - 체육복

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번

programmers.co.kr

def solution(n, lost, reserve): 
    los = set(lost) - set(reserve)
    res = set(reserve) - set(lost)
    
    for i in res: # ex) i = 3
        if i-1 in los: 
            los.remove(i-1) # ex) i-1 = 2
        elif i+1 in los: 
            los.remove(i+1) 
    
    return n-len(los)

 

 

8) 포켓몬

https://programmers.co.kr/learn/courses/30/lessons/1845

 

코딩테스트 연습 - 폰켓몬

당신은 폰켓몬을 잡기 위한 오랜 여행 끝에, 홍 박사님의 연구실에 도착했습니다. 홍 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다.

programmers.co.kr

 

def solution(nums):
    a = len(nums) // 2    # 고를 수 있는 횟수
    b = len(set(nums))    # 포켓몬 종류

    return a if b > a else b

 

 

9) 비밀지도

https://programmers.co.kr/learn/courses/30/lessons/17681

 

코딩테스트 연습 - [1차] 비밀지도

비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다

programmers.co.kr

 

- 1차 시도

 

 

10) 키패드 누르기

https://programmers.co.kr/learn/courses/30/lessons/67256

 

코딩테스트 연습 - 키패드 누르기

[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

programmers.co.kr

- 1차 시도 (실패)

2,5,8,0 키패드를 누를 때 L과 R이 반대로 나오는 문제 

def solution(numbers, hand):
    answer = ''
    nowLeft = 0
    nowRight = 0
    
    for i in range(len(numbers)):
        if numbers[i] == 1 or numbers[i] == 4 or numbers[i] == 7:
            nowLeft = numbers[i]
            answer += "L"
        elif numbers[i] == 3 or numbers[i] == 6 or numbers[i] == 9:
            nowRight = numbers[i]
            answer += "R"
        else:
            if nowLeft - numbers[i] > nowRight - numbers[i]:
                answer += "R"
            elif nowLeft - numbers[i] < nowRight - numbers[i]:
                answer += "L"
            else:
                if hand == "right":
                    answer += "R"
                else:
                    answer += "L"

    return answer

 

 

- 2차 시도

 

 

11) 다트게임

https://programmers.co.kr/learn/courses/30/lessons/17682

 

코딩테스트 연습 - [1차] 다트 게임

 

programmers.co.kr

- 1차 시도 (4,5,6,7번에서 런타임 에러 발생)

문자열로 구성된 dartResult를 리스트로 만들었는데, 정수 10의 경우 1과 0으로 나뉘어 이 부분을 예외처리하는 과정에서 런타임 에러가 발생한 것 같다.

 

- 2차 시도 (테스트 4,5,6,7이 런타임 에러였는데, 5,6,7은 해결)

질문하기에 나와 같은 테스트 케이스의 런타임 에러가 발생하는 경우가 있어서 Parameters "10D4S10D" / return 204 추가해서 코드 실행 후 제출 했다.

 

- 3차 시도

 

 

 

12) 크레인 인형뽑기 게임

https://programmers.co.kr/learn/courses/30/lessons/64061

 

코딩테스트 연습 - 크레인 인형뽑기 게임

[[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]] [1,5,3,5,1,2,1,4] 4

programmers.co.kr

 

def solution(board, moves):
    answer = 0
    temp = []
    
    for i in moves:
        for j in range(len(board[0])): # 정사각 격자니까 board[0]의 길이로 통일
            if board[j][i-1] != 0:
                temp.append(board[j][i-1])    
                board[j][i-1] = 0      # temp에 담은 숫자는 0으로 바꿔줌
                break
                
        if len(temp) >= 2 and temp[-2] == temp[-1]: # 길이가 2 이상일 경우 / temp의 마지막 2개가 같을 경우
            answer += 2
            temp.pop()
            temp.pop()
            
    return answer