프로그래머스 특강

김태경·2023년 6월 29일
0

코딩테스트

목록 보기
10/12
post-thumbnail

최대 사과의 개수


제한된 박스 수 중 이미 실은 박스의 수를 세기 위한 nbox라는 변수 생성했습니다!
먼저 입력받은 리스트를 사과의 개수인 x[1]과 박스의 개수인 x[0]을 기준으로 정렬하였습니다.

이후, 더 실을 수 있는 박스의 개수(limit-nbox)보다 현재 위치한 박스 종류의 개수가 더 작으면 사과의 개수에 box[i][1] x box[i][0]을 해주었으며 그렇지 않은 경우에는 더 실을 수 있는 박스의 개수 만큼 현재 위치한 박스 종류의 사과 개수를 box[i][1] x (limit-nbox) 더해주었습니다.

def solution(box, limit):
    answer = 0
    nbox=0
    box.sort(key=lambda x: (-x[1],-x[0]))
    for i in range(len(box)):
        if box[i][0]<=limit-nbox:
            answer+=box[i][1]*box[i][0]
            nbox+=box[i][0]
        else:
            answer+=box[i][1]*(limit-nbox)
            nbox+=box[i][0]
            break
        
            
    return answer  

공주 구하기


공주 구하기 문제는 deque를 이용하였습니다.
만약 3을 외친 왕자가 제외된다고하면 1,2를 외친 왕자까지는 꼬리에 다시
붙어야합니다. 그래서 for i in range(k-1)을 사용하여 제외 될 숫자를 외친 왕자 전의 왕자까지 queue.popleft()를 한 후 queue에 다시 append해줍니다. 바로 다음은 제외될 왕자이므로 for문 밖에서 popleft를 해줍니다.
계속 반복한 후 queue의 개수가 1이 되면 그 수를 return 해주면, 공주를 구하러 갈 왕자의 번호를 출력하게 됩니다.

from collections import deque
def solution(n, k):
    answer = 0
    prince=range(1,n+1)
    queue=deque(prince)
    while queue:
        for i in range(k-1):
            queue.append(queue.popleft())
            
        queue.popleft()
        
        if len(queue)==1:
            
            answer=queue.popleft()
        
    
                   
    return answer

이진수 정렬


먼저 이진수로 바꿔주기 위해 format함수를 사용하였습니다. 그리고 이진수에서 1의 개수를 세기 위하여 for문을 이용하였고, answer이라는 공리스트에
[10진수,2진수에서의 1의 개수]의 형태로 append해주었습니다.
그러고 난 후 answer 리스트를 1의 개수, 10진수 값을 오름차순으로 정렬한 후 10진수 값을 출력하는 코드를 짜보았습니다.

def solution(nums):
   answer = []
   for i in nums:
       a=0
       for j in format(i,'b'):
           if j=='1':
               a+=1
       answer.append([i,a])

   answer.sort(key = lambda x: (x[1],x[0]))
   result=[]
   
   for i in answer:
       result.append(i[0])
       
   
           
   return result

연속된 문자 지우기

def solution(s):
    stack=[]
    for i in s:
        if len(stack)==0:
            stack.append(i)
        else:
            if i!=stack[-1]:
                stack.append(i)
            else:
                stack.pop()
            
    return ''.join(stack)

Backspace

def solution(s):
    stack = []
    for x in s:
        if x == '#':
            if len(stack) > 0:
                stack.pop()          
        else:
            stack.append(x)
    return "".join(stack)

이진탐색


def solution(nums, target):
    answer=-1
    right=len(nums)-1
    left=0
    while left<=right:
        mid=(left+right)//2
        if nums[mid]==target:
            return mid
        elif nums[mid]<target:
            left=mid+1
        else:
            right=mid-1
            
    return answer
    
profile
신입 ^3^

0개의 댓글