목록Algorithm/Stack, Queue (8)
우노
문제 링크 https://www.acmicpc.net/problem/5397 풀이 커서의 위치를 index = 0으로 둔 다음, 화살표에 따라 index를 변환하는 방식은 시간 복잡도가 높아 시간 초과가 발생합니다. 문자열이 최대 길이는 1,000,000 이기 때문입니다. 따라서, 커서는 그대로 두고, 커서를 기준으로 왼쪽 문자열은 left라는 배열에, 오른쪽 문자열은 right라는 배열에 담는 방식으로 문제를 해결할 수 있습니다. 세부 알고리즘은 다음과 같습니다. 문자열이 들어오면 왼쪽 배열에 붙입니다. ‘>’ 가 들어오면 오른쪽 배열의 마지막 문자를 왼쪽 배열의 마지막에 붙입니다. ‘’ 는 오른쪽 배열의 마지막 문자를 왼쪽 배열의 마지막에 붙이는것이므로, 오른쪽 배열에 문자가 존재해야합니다. ‘
문제 링크 https://www.acmicpc.net/problem/6198 풀이 모든 빌딩을 순서대로 탐색하며, 아래 조건에 따라 현재 탐색하고 있는 빌딩의 높이를 Stack에 삽입 현재 탐색하고 있는 빌딩의 높이가 Stack TOP보다 크거나 같다면, 현재 탐색하고 있는 빌딩의 높이가 TOP보다 작아질때까지 Stack TOP 제거 현재 탐색하고 있는 빌딩의 높이가 Stack TOP보다 작다면, Stack에 존재하는 빌딩 수 만큼 결과에 덧셈 현재 탐색하고 있는 빌딩의 높이를 Stack에 삽입 코드 import sys # 빌딩의 개수 n = int(sys.stdin.readline()) # 빌딩들의 높이 arr = [] for _ in range(n): arr.append(int(sys.stdin.re..
문제 링크 https://www.acmicpc.net/problem/2493 풀이 모든 탑을 순서대로 탐색하며, 아래 조건에 따라 전처리한 뒤, 현재 탑의 정보를 (높이, 위치) 형식으로 Stack에 저장 현재 탐색하고 있는 탑의 높이가 Stack TOP의 높이보다 작다면, 현재 탐색하고 있는 탑의 레이저를 수신 받을 수 있는 탑의 위치를 저장 현재 탐색하고 있는 탑의 높이가 Stack TOP의 높이보다 크다면, Stack TOP 제거 코드 import sys # 탑의 수 n = int(sys.stdin.readline()) # 탑의 높이 arr = [0] + list(map(int, sys.stdin.readline().split())) # 결과 배열 result = [0] * (n+1) # 스택 초기..
문제 링크 https://www.acmicpc.net/problem/3986 풀이 Stack을 사용해서 해결할 수 있습니다. 모든 문자를 순서대로 탐색하며, 현재 탐색 중인 문자가 Stack의 TOP과 동일하다면, Stack의 TOP을 제거하고 Stack의 TOP과 동일하지 않다면, 현재 문자를 Stack에 삽입합니다. 모든 문자를 탐색한 이후, Stack에 문자들이 남아있지 않다면 좋은 단어입니다. 코드 import sys # 단어의 수 n = int(sys.stdin.readline()) # 좋은 단어의 수 result = 0 for i in range(n): line = sys.stdin.readline().rstrip() # 첫 번째 문자는 스택에 바로 삽입 stack = [line[0]] for..
문제 링크 https://www.acmicpc.net/problem/4949 풀이 기본적인 스택 문제입니다. 우선, { ‘닫는 괄호’ : ‘여는 괄호’ } 형식으로 모든 괄호를 사전으로 생성합니다. 이후, stack을 생성한 뒤, 문자열 s를 처음부터 훑으면서 열린 괄호라면 stack에 push하고 닫힌 괄호라면 stack에서 pop한 top과 비교합니다. 닫힌 괄호와 top이 짝이 맞지 않는다면 False 닫힌 괄호가 등장했지만, 스택에 열린 괄호가 없을 경우 False 세부 풀이는 아래 코드에 설명되어있습니다. 코드 import sys while True: line = sys.stdin.readline().rstrip() if line == '.': break # 스택 생성 stack ..
문제 링크 https://school.programmers.co.kr/learn/courses/30/lessons/42883 풀이 문제에 따르면, 입력 numbers에 대해서 해당 문자열이 가장 큰 수를 만들게끔 k개를 빼야 합니다. 예제 입력을 살펴보겠습니다. numbers = "4177252841", k = 4 어떻게 가장 큰 수를 만들 수 있을까요? 먼저, 일단 숫자가 나오면 스택에 저장합니다. 그리고 그 숫자보다 큰 숫자가 나오면 스택에 저장했던 수를 빼보면 어떨까요? 자 시작해봅시다. 처음 숫자인 4를 넣습니다. stack = ["4"] ( k = 4 ) 그 후 1을 넣습니다. 1은 스택에 마지막으로 저장된 4보다 작기 때문에 뺄 필요가 없습니다. stack = ["4", "1"] ( k = 4..
문제 링크 https://school.programmers.co.kr/learn/courses/30/lessons/42586 풀이 작업이 끝나기까지 남은 일수를 모두 큐에 넣은 뒤, 큐에서 요소들을 하나씩 빼며, 현재 요소가 이전에 뺏던 요소들 중에 가장 큰 값인지 확인합니다. 가장 큰 값이라면 새로운 배포 일정을 추가합니다. 가장 큰 값이 아니라면 마지막 배포 일정에 현재 기능의 개수를 추가합니다. 따라서, 큐가 [5, 10, 1, 1, 20, 1]로 이루어져있다면 결과로 [1, 3, 2]가 됩니다. 예외 케이스로, progresses [95, 94]와 speeds [3, 3]가 있습니다. 코드 from collections import deque def solution(progresses, speed..
문제 설명 여섯 가지 괄호 '(', ')', '{', '}', '[', ']'로 이루어진 문자열이 바르게 닫힌 문자열인지 알아보려 합니다. 바르게 닫힌 문자열이라는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로, '[' 문자로 열렸으면 반드시 짝지어서 ']' 문자로, '{' 문자로 열렸으면 반드시 짝지어서 '}' 문자로 닫히는 문자열입니다. 또한, 괄호 쌍 안에는 다른 괄호 쌍이 들어갈 수 있습니다. 예제 입력 및 출력은 아래와 같습니다. “{{}}” 또는 “({})[]” 는 바르게 닫힌 괄호입니다. “[)”, “]()[”..