def divide(p):
open_ = 0
close_ = 0
for i in range(len(p)):
if p[i] =='(':
open_ += 1
else:
close_ += 1
if open_ == close_:
return p[:i+1], p[i+1:]
def check(u):
stack = []
for i in u:
if i =='(':
stack.append(i)
else:
if not stack:
return False
stack.pop()
return True
def solution(p):
if not p:
return ''
u, v = divide(p)
if check(u):
return u + solution(v)
else:
answer = '('
answer += solution(v)
answer += ')'
for i in u[1:len(u)-1]:
if i == '(':
answer += ')'
else:
answer += '('
return answer
< 풀이 과정 >
순서대로 구현만 해주면 되는 문제
구현에 앞서 p 문자열을 u,v로 나누어주는 divide 함수와 u문자열이 '올바른 괄호 문자열'인지를 확인해주는 check 함수를 생성하였다.
위와 같이 함수 구성한 이후 문제에서 주어진 순서대로 구현하면 되는 문제다.
원하는 결과는 리턴되는 answer이므로 문제에서 요구하는대로 입력해주고 u의 문자와 반대로 입력하여 결과 리턴하면 된다.
from itertools import permutations
def operate(n1, n2, operation):
if operation == '+':
return str(int(n1) + int(n2))
if operation == '-':
return str(int(n1) - int(n2))
if operation == '*':
return str(int(n1) * int(n2))
def calculate(expression, operation):
array = []
check = ''
for i in expression:
if i.isdigit() == True:
check += i
else:
array.append(check)
array.append(i)
check = ''
array.append(check)
for op in operation:
stack = []
while len(array) != 0:
tmp = array.pop(0)
if tmp != op:
stack.append(tmp)
else:
stack.append(operate(stack.pop(), array.pop(0), op))
array = stack
return abs(int(array[0]))
def solution(expression):
operation = ['+', '-', '*']
operation = list(permutations(operation, 3))
answer = []
for i in operation:
answer.append(calculate(expression, i))
return max(answer)
< 풀이 과정 >
def convert_melody(melody):
if 'C#' in melody:
melody = melody.replace('C#', 'c')
if 'D#' in melody:
melody = melody.replace('D#', 'd')
if 'F#' in melody:
melody = melody.replace('F#', 'f')
if 'G#' in melody:
melody = melody.replace('G#', 'g')
if 'A#' in melody:
melody = melody.replace('A#', 'a')
return melody
def solution(m, musicinfos):
answer = []
music_idx = 0
for music_info in musicinfos:
music_idx += 1
music = music_info.split(',')
start_time = music[0].split(':')
end_time = music[1].split(':')
play_time = int(end_time[0])*60 + int(end_time[1]) - int(start_time[0])*60 - int(start_time[1])
title = music[2]
melody = convert_melody(music[3])
m = convert_melody(m)
music_length = len(melody)
real_play_melody = melody * (play_time//music_length) + melody[:play_time%music_length]
if m in real_play_melody:
answer.append([play_time, music_idx, title])
if not answer:
return "(None)"
elif len(answer) == 1:
return answer[0][2]
else:
answer = sorted(answer, key= lambda x: (-x[0], x[1]))
return answer[0][2]
< 풀이 과정 >
def solution(rows, columns, queries):
answer = []
num = 1
matrix = [[0 for _ in range(columns)] for _ in range(rows)]
for row in range(rows):
for col in range(columns):
matrix[row][col] = num
num += 1
for x1, y1, x2, y2 in queries:
check = matrix[x1-1][y1-1]
mini = check
for i in range(x1-1, x2-1):
value = matrix[i+1][y1-1]
matrix[i][y1-1] = value
mini = min(value, mini)
for i in range(y1-1, y2-1):
value = matrix[x2-1][i+1]
matrix[x2-1][i] = value
mini = min(value, mini)
for i in range(x2-1, x1-1, -1):
value = matrix[i-1][y2-1]
matrix[i][y2-1] = value
mini = min(value, mini)
for i in range(y2-1, y1-1, -1):
value = matrix[x1-1][i-1]
matrix[x1-1][i] = value
mini = min(value, mini)
matrix[x1-1][y1] = check
answer.append(mini)
return answer
< 풀이 과정 >
1. rows x columns 길이 만큼의 숫자가 각각 1 ~ (rows x columns)개로 채워진 matrix 생성하기.
2. matrix에서 (x1,y1) ~ (x2,y2) 범위 내의 현재 최솟값은 x1, y1이므로 이를 mini로 저장하고 시계 방향으로 숫자를 돌린다고 했는데 왼쪽 세로, 아래쪽, 오른쪽 세로, 위쪽 방향으로 순차적으로 돌리고 나면 (x1,y1) 값이 사라지고 (x1+1,y1)값이 (x1,y1+1)로 복사가 된다.
3. 이를 방지하고자 for문을 다 돌고나서 앞서 최솟값으로 저장해놓은 check를 x1,y1+1에 위치시킨 후 answer에 최솟값(mini)를 append하면 되는 문제.
시계 방향대로 회전을 진행하고 나면 값이 2개가 겹치는 현상이 발생하고, 저장해놓은 최솟값만을 이동시키는 효율적인 방법을 찾느라 시간이 좀 걸렸던 문제.
구현에 앞서 실제로 손으로 풀어보고 나서 구현하느라 애를 좀 먹었다😭
Programmers LV 2 Page 1 ~ Page 3 Clear!!✍️🙌