Algoritm/BOJ 30

[BOJ] 10799번: 쇠막대기

■ 문제풀이 기본적인 자료구조 pop, append를 사용한 문제입니다. 각 막대기 '(' 모양일 경우 stack에 append 합니다. 각 막대기 ')' 모양일 경우 조건이 두 가지 입니다. ')' 막대기가 나오기 이전 '(' 일 경우 stack에 쌓인 막대기를 pop 시킨 후 남아 있는 막대기 개수를 더합니다. ')' 막대기가 나오기 이전 ')'일 경우 stack에 쌓인 막대기를 pop 시킨 후 잘린 막대기의 끄트머리 개수를 +1 시킵니다. ■ 문제해답 import sys input = sys.stdin.readline bar_razor = list(input().rstrip()) answer = 0 stack = [] for i in range(len(bar_razor)): if bar_razor[..

Algoritm/BOJ 2022.11.21

[BOJ] 1158번: 요세푸스 문제

■ 문제풀이 k 번째 사람을 pop 시켜 ans 리스트에 추가 시킵니다. 과정에서 num이 남아있는 josephus의 리스트 보다 작다면 num의 값에 josephus 리스트 개수를 빼주며 나머지 값들 또한 순서에 맞게 ans 리스트에 추가 시킵니다. ■ 문제해답 import sys input = sys.stdin.readline n, k = map(int, input().split()) josephus = [] for i in range(1, n + 1): josephus.append(i) ans = [] num = k - 1 while len(josephus): if num >= len(josephus): num = num - len(josephus) else: ans.append(str(joseph..

Algoritm/BOJ 2022.09.11

[BOJ] 10845번: 큐

■ 문제해설 다음 문제는 queue를 이용한 문제이고, python에서 제공하는 deque를 이용하여 문제를 해결하였습니다. 기본 리스트에서 값을 빼낼때 pop이 아닌 popleft를 사용합니다. queue는 FIFO 구조 입니다. 1) pop [1, 2, 3, 4] [1, 2, 3] [1, 2] [1] 2) popleft [1, 2, 3, 4] [2, 3, 4] [3, 4] [4] ■ 문제해답 from collections import deque import sys input = sys.stdin.readline n = int(input()) q = deque() for i in range(n): m = input().split() if m[0] == 'push': q.append(m[1]) elif ..

Algoritm/BOJ 2022.09.06

[BOJ] 1406번: 에디터

■ 문제해결 왼쪽으로 커서가 이동할 경우 ('L') string(입력 문자열) 값에서 cursor 리스트에 push 시켜줍니다. 또한 오른쪽으로 커서가 이동할 경우 ('R') cursor 리스트에서 string(입력 문자열) 로 push 시켜줍니다. 이 후 cursor 리스트 값들은 LIFO 구조로 인해 문자열이 뒤집어져 있어서 리스트 속성을 이용해 문자열을 뒤집어 줍니다. ■ 문제해답 import sys input = sys.stdin.readline string = list(input().rstrip()) n = int(input()) cursor = [] for i in range(n): m = input().split() if m[0] == 'L' and string != []: cursor.ap..

Algoritm/BOJ 2022.09.06

[BOJ] 1874번: 스택 수열

■ 문제해결 처음 문제를 읽어보면서 풀이를 진행하는데 이해하기가 어려웠고, 구글링을 통해 해답을 보며 이해하였다. stack에 값이 --- [1] [1, 2] [1, 2, 3] [1, 2, 3, 4] --- 다음과 같이 push되게 된다. 다음 과정에서 data 즉 입력 받는 값이 stack 의 최상단의 값인 '4'와 같게 된다면 pop 시키고 '-' 값을 ans에 push하며 풀이된다. 문제를 이해하는데 어려움이 있었지만 push, pop을 이용한 간단한 알고리즘 문제였다. ■ 문제해답 import sys input = sys.stdin.readline n = int(input()) stack = [] ans = [] count = 1 result = True for i in range(n): data..

Algoritm/BOJ 2022.09.06

[BOJ] 9012번: 괄호

■ 문제해결 올바른 괄호 문자열을 VPS라고 부른다. VPS의 타당성을 확인할 check 함수를 별도로 구성하였고, stack 리스트에 vps 입력값의 괄호를 pop 시켜 ')' 값이 나오면 stack에 append 시키고, '(' 값이 나오면 stack에 존재하는 ')' 값을 pop 시킵니다. 과정 중에 stack의 값이 존재한다면 올바른 VPS가 아니므로 return False 시킵니다. 이 후 stack의 리스트에 '(' 값이 존재 한다면 VPS의 타당성을 만족시키지 않으므로 return False 시키고, stack의 리스트에 값이 존재하지 않는다면 VPS의 타당성을 만족시키므로 return True 시킵니다. ※ 리스트의 값이 존재하면 if 판정은 '참(True)'으로 내린다. 하지만 리스트가 ..

Algoritm/BOJ 2022.09.06

[BOJ] 9093번: 단어 뒤집기

■ 문제해설 먼저 문단의 내용들을 list 안에 list로 저장하고, 이 후 문단의 값들을 하나씩 .join 하여 값들을 list의 특성을 이용하여 거꾸로 뒤집는다. 입력이 다음과 같으며, 2 I am happy today We want to win the first prize 출력은 다음과 같다. --> sentence = list(map(list, input().split())) [['I'], ['a', 'm'], ['h', 'a', 'p', 'p', 'y'], ['t', 'o', 'd', 'a', 'y']] [['W', 'e'], ['w', 'a', 'n', 't'], ['t', 'o'], ['w', 'i', 'n'], ['t', 'h', 'e'], ['f', 'i', 'r', 's', 't'], ..

Algoritm/BOJ 2022.09.06

[BOJ] 10828번: 스택

■ 문제해설 각 기능별로 (push, pop, size, empty, top) 함수로 구현하였고, stack이 비어있는 경우에는 len(stack) == 0을 이용하여 조건문을 구성하였다. ■ 문제해답 import sys input = sys.stdin.readline n = int(input()) stack = [] def push(x): return stack.append(x) def pop(): if len(stack) == 0: return -1 else: return stack.pop() def size(): return len(stack) def empty(): if len(stack) == 0: return 1 else: return 0 def top(): if len(stack) == 0:..

Algoritm/BOJ 2022.09.06

[BOJ] 1107번: 리모콘

■ 문제 해설 - 현재 채널에서 + 혹은 -만 사용하여 이동하는 경우 - range(100001)로 잡은 이유는 +일 경우보다 -일 경우가 더 최적의 해를 가질 수 있기 때문 - 가장 가까운 버튼 + 길이 (가장 가까운 위치만큼 리모콘을 누르기 때문에 +len(channel)) - 브루트 포스 ■문제 해답 import sys input = sys.stdin.readline n = int(input()) m = int(input()) broken = list(map(int, input().split())) min_count = abs(100 - n) # 현재 채널에서 + 혹은 -만 사용하여 이동하는 경우 for channel in range(1000001): channel = str(channel) for..

Algoritm/BOJ 2022.04.20

[BOJ] 1476번: 날짜 계산

■ 문제 해설 - 브루트 포스 - 입력 값이 조건을 충족할 때 까지 while을 통해 반복 - 조건 충족 시 break ■ 문제 해답 import sys input = sys.stdin.readline e_i, s_i, m_i = map(int, input().split()) e, s, m, year = 1, 1, 1, 1 while True: if e_i == e and s == s_i == s and m_i == m: break e += 1 s += 1 m += 1 year += 1 if e >= 16: e = 1 if s >= 29: s = 1 if m >= 20: m = 1 print(year) 문제 출처 : https://www.acmicpc.net/problem/1476 1476번: 날짜 계산..

Algoritm/BOJ 2022.04.20