ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 묘공단 (코딩 테스트 합격자 되기 파이썬편)
    코딩 테스트 합격자 되기 파이썬 편 2024. 1. 26. 11:40

    큐?

    큐(queue)는 ‘줄을 서다’라는 뜻을 갖고있다. 큐는 먼저 들어간 데이터가 먼저 나오는 자료구조이며, 즉 선입선출 또는 FIFO라고 한다. 스택과 마찬가지로 삽입하는 연산을 푸시, 꺼내는 연산을 팝이라고 합니다.

     

    큐에서 데이터가 이동하는 과정

    1. 빈 큐를 하나 선언한다.
    2. 원소를 삽입한다. 빈 큐이므로 제일 앞에 삽입한다. 이어서 5를 삽입한다. 5는 2 다음으로 삽입했으니 2보다 뒤에 있다.
    3. 팝을 하면 5가 아닌 2가 먼저 나온다. 이어서 팝을 한 번 더 진행하면 5가 빠져나온다.

     

     

     

     

    큐의 특성을 활용하는 두가지 방법 

    • 작업 대기열 : 네트워크 통신을 할 때 다수의 클라이언트에서 서버에서 작업을 요청하면 서버는 요청이 들어온 순서대로 작업을 처리한다. 이러할 때 큐를 활용가능.
    • 이벤트 처리 : 어떤 애플리케이션이나 시스템에서 사용자의 이벤트, 예를 들어 키보드 입력이나 마우스의 움직임을 처리할 때 큐를 활용 가능.

     

    큐 구현하기

    큐를 구현하는 방식에는 리스트를 활용하는 방식과 덱을 활용하는 방식 두가지가 있다.

    1. 리스트를 큐처럼 활용하기
      푸시 연산은 append() 메서드를 활용, 팝 연산은 pop() 메서드를 활용한다.
    queue = [ ]
    
    # 푸시 연산
    queue.append(1)
    queue.append(2)
    queue.append(3)
    
    # 팝 연산
    first_item = queue.pop(0)
    print(first_item)

     

     

    2.덱을 큐처럼 활용하기 
      덱(Double Ended Queue)은 양 끝에서 삽입이나 삭제할 수 있는 큐를 구현한 것이다. 이러한 양쪽에서 삽입이나 삭제를 할 수 있다는 특징 때문에 큐를 구현할 때는 덱을 사용하는게 좋다.

    from collections import deque
    
    queue = deque( )
    
    # 푸시 연산
    queue.append(1)
    queue.append(2)
    queue.append(3)
    
    # 팝 연산
    first_item = queue.popleft( )
    print(first_item)

     

    몸풀기

     

    15. 요세푸스 문제

    N명의 사람이 원 형태로 서있다. 각 사람은 1부터 N까지 번호표를 갖고 있다. 그리고 임의의 숫자 K가 주어졌을 때 다음과 같이 사람을 없앤다. N과 K가 주어질 때 마지막에 살아있는 사람의 번호를 반환하는 solution()함수를 구현해라.

     

    제약조건

    • N과 K는 1이상 1,000 이하의 자연수이다.N K return
      N K return
      5 2 3
    from collections import deque
    
    def solution(N, k):
        queue = deque(range(1, N+1))
    
        while len(queue) > 1:
            for i in range(k-1):
                queue.append(queue.popleft())
            queue.popleft()
        print(queue[0])
    
    N = 5
    k = 2
    solution(N, k)

     

    16. 기능 개발

    프로그래머스팀에서는 기능 개선 작업을 수행 중이다. 각 기능은 진도가 100%일 때 서비스를 반영할 수 있다. 각 기능의 개발 속도는 모두 다르므로 뒤의 기능이 앞의 기능보다 먼저 개발될 수 있다. 이때 뒤의 기능은 앞의 기능이 배포 될때 같이 배포되어야한다. 배포 순서대로 작업 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지 반환하도록 solution()함수를 완성해라

     

    제약조건

    • progresses와 speeds의 배열의 길이는 100 이하이다.
    • 작업 진도는 100 미만의 자연수이다.
    • 작업 속도는 100이하의 자연수이다.
    • 배포는 하루에 한 번만 가능하며, 하루의 끝에 이루어진다고 가정한다. 진도율이 95%인 작업의 개발속도가 하루에 4%라면 배포는 2일뒤이다.
    progresses speeds  return
    [93, 30, 55] [1, 30, 5] [2, 1]
    [95, 90, 99, 99, 80, 99] [1, 1, 1, 1, 1, 1] [1, 3, 2]

     

    from collections import deque
    
    def solution(progresses, speeds):
        queue = deque(progresses)
        speed_queue = deque(speeds)
        run = False
        result_item = 0
        result = []
    
        while len(queue) > 0:
            for i in range(len(queue)):
                queue.append(queue.popleft() + speed_queue[0])
                speed_queue.append(speed_queue.popleft())
            
            if queue[0] >= 100:
                while queue and queue[0] >= 100:
                    queue.popleft()
                    result_item += 1
            
            if result_item > 0:
                result.append(result_item)
                result_item = 0
        print(result)
            
    progresses = [95, 90, 99, 99, 80, 99]
    speeds = [1, 1, 1, 1, 1, 1]
    solution(progresses, speeds)

     

     

    17. 카드 뭉치

    다음과 같은 규칙으로 카드에 적힌 단어들을 사용해 원하는 순서의 단어 배열을 만들 수 있는지 알고싶다.

    • 원하는 카드 뭉치에서 카드를 순서대로 한 장씩 사용한다.
    • 한 번 사용한 카드는 다시 사용할 수 없다.
    • 카드를 사용하지 않고 다음 카드로 넘어갈 수 없다.
    • 기존에 주어진 카드 뭉치의 단어 순서는 바꿀 수 없다.

    문자열로 이루어진 배열 cards1, cards2와 원하는 단어 배열 goal이 매개변수로 주어질 때 cards1과 cards2에 적힌 단어들로 goal을 만들 수 있다면 “Yes”, 만들 수 없다면 “No”를 반환하는 solution() 함수를 완성해라.

     

    제약조건

    • cards1과 cards2의 길이는 1이상 10이하이다.
    • goal의 길이는 2이상 cards1+cards2 이하이다.
    • 문자열들은 모두 알파벳 소문자로만 이루어져 있다.
    cards1 cards2 goal  result
    ["i", "drink", "water"] ["want", "to"] ["i", "want", "to", "drink", "water"] “Yes”
    ["i", "water", "drink"] ["want", "to"] ["i", "want", "to", "drink", "water"] “No”

     

     

    from collections import deque
    
    def solution(cards1, cards2, goal):
        queue = deque()
        cards1_queue = deque(cards1)
        cards2_queue = deque(cards2)
        goal_queue = deque(goal)
        result = ""
        
        for i in range(len(goal)):
            if len(cards1_queue) > 0:
                word1 = cards1_queue.popleft()
            if len(cards2_queue) > 0:
                word2 = cards2_queue.popleft()
            if len(goal_queue) > 0:
                word3 = goal_queue.popleft()
    
            if word3 == word1:
                queue.append(word1)
                goal_queue.append(word3)
                cards2_queue.appendleft(word2)
            
            elif word3 == word2:
                queue.append(word2)
                goal_queue.append(word3)
                cards1_queue.append(word1)
            
            elif word3 != word1 and word3 != word2:
                result = "No"
            
        if result != "No":
            result = "Yes"
        
        print(result)
    
    cards1 = ["i", "water", "drink"]
    #cards1 = ["i", "drink", "water"]
    cards2 = ["want", "to"]
    goal = ["i", "want", "to", "drink", "water"]
    solution(cards1, cards2, goal)
Designed by Tistory.