Programmers LV 2 - Berlin 5

김태준·2023년 1월 3일
0

Travel

목록 보기
6/8

문제 풀이

괄호 변환

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 함수를 생성하였다.

  • u,v로 문자를 나누는 기준?
    괄호 (와 ) 개수가 일치하면 split 진행
  • u가 올바른 괄호 문자열인지 판단하는 기준?
    stack을 활용하여 u문자열 순서대로 (면 append, )면 pop하여 진행해서 stack이 비면 True, 아니면 False 리턴

위와 같이 함수 구성한 이후 문제에서 주어진 순서대로 구현하면 되는 문제다.
원하는 결과는 리턴되는 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)

< 풀이 과정 >

  • 숫자와 연산자를 입력 받아 결과를 리턴하는 operate함수, 식과 연산자를 입력받아 식의 결과를 리턴해주는 calculate함수, 연산자의 우선순위를 결정해 최종 결과를 리턴하는 solution함수 총 3가지를 생성
  • calculate 함수
    stack을 이용하여 숫자인 경우 stack에 집어넣고, 연산자인 경우 stack과 array의 연산 결과를 이용하여 array라는 배열에 결과 리턴
  • solution 함수
    연산자의 우선순위를 결정하기 위해 3P3으로 조합하여 6가지의 경우의 수를 만들고 for문으로 calculate함수를 돌려 최댓값 리턴

[3차] 방금그곡

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] 

< 풀이 과정 >

  • convert_melody 함수
    m과 musicinfos 리스트 내 멜로디의 #을 제거해주기 위해 소문자로 변경하는 convert_melody 함수 생성
  • solution 함수
    music_idx로 입력받는 음악의 인덱스 생성, 주어진 리스트 ,로 split하여 음악 시작 시간(start_time), 끝나는 시간(end_time), 재생시간(play_time), 음악 제목(title)생성
    재생 시간 동안의 멜로디(real_play_melody)를 찾은 후 입력받는 m이 내부에 포함되어 있으면 answer 리스트에 재생시간, 입력받은 음악의 순서, 음악제목을 입력해준다.
    이후 answer가 공란이면 (None)을, 1개면 바로 음악제목을, 2개 이상인 경우 재생시간은 내림차순, 입력받은 순서는 오름차순 정렬을 하여 첫번째 answer 리스트의 제목을 리턴해준다.

행렬 테두리 회전하기

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!!✍️🙌

profile
To be a DataScientist

0개의 댓글