목록Algorithm (178)
우노
문제 링크 https://www.acmicpc.net/problem/2615 풀이 모든 칸을 순서대로 확인하며, 4가지 방향(→ ↓ ↘ ↗)을 탐색합니다. 연속된 다섯 개의 바둑알 중 가장 왼쪽에 있는 바둑알의 좌표를 출력해야하기 때문입니다. 또한, 5칸 연속으로 바둑알이 놓여져있을 경우, 육목인 케이스를 걸러줘야합니다. 첫 바둑알을 놓은 방향 이전에 바둑알이 하나 더 있는지 확인 마지막 바둑알을 놓은 방향 이후에 바둑알이 하나 더 있는지 확인 코드 import sys # 바둑판 초기화 board = [] for i in range(19): board.append(list(map(int, sys.stdin.readline().split()))) # 연속된 다섯 개의 바둑알 중 가장 왼쪽에 있는 바둑알의 ..
문제 링크 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://www.acmicpc.net/problem/1541 풀이 최솟값을 만들기 위해서는 - 기준으로 괄호를 치면 됩니다. 예를 들어, 55 - 50 + 40 - 30 + 20 을 입력 받았을 때, - 기준으로 괄호를 친다면, 55 - (50 + 40) - (30 + 20) 가 되며, 이는 최솟값이 됩니다. 세부 알고리즘은 아래 코드와 같으며, ['55', '50 + 40', '30 + 20']로 전처리했을 때, 각 원소들을 원소들의 합으로 변환한 뒤, 맨 처음의 원소는 더하고 나머지 원소들은 빼주면 됩니다. 코드 import sys # 입력 문자열 input_ = sys.stdin.readline().rstrip() # 숫자 배열 num_ar..
문제 링크 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..
문제 링크 https://school.programmers.co.kr/learn/courses/30/lessons/42746 풀이 permutations 함수를 사용하면 시간초과가 발생합니다. 해당 문제의 핵심은, 숫자들을 문자열들로 변환한 뒤 내림차순 정렬했을 때, 3이 30보다 앞에 있어야한다는 것입니다. [’9’, ‘5’, ‘34’, ‘3’, ‘30’] 따라서, 각 문자열들을 3번 반복한 문자열들로 변환한 뒤, 내림차순 정렬합니다. [999, 555, 343434, 333, 303030] 각 문자열들을 3번 반복하는 이유는, numbers의 숫자들은 0 이상 1,000 이하로 이루어져있기 때문에, 각 문자열들을, 1000을 넘지 않는 가능한 최대 자리수까지 채워서 비교하기 위함입니다. 코드 def ..
문제 설명 여섯 가지 괄호 '(', ')', '{', '}', '[', ']'로 이루어진 문자열이 바르게 닫힌 문자열인지 알아보려 합니다. 바르게 닫힌 문자열이라는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로, '[' 문자로 열렸으면 반드시 짝지어서 ']' 문자로, '{' 문자로 열렸으면 반드시 짝지어서 '}' 문자로 닫히는 문자열입니다. 또한, 괄호 쌍 안에는 다른 괄호 쌍이 들어갈 수 있습니다. 예제 입력 및 출력은 아래와 같습니다. “{{}}” 또는 “({})[]” 는 바르게 닫힌 괄호입니다. “[)”, “]()[”..