[Algorithm] 괄호 변환, 방금그곡, 줄 서는 방법

리쫑·2023년 2월 21일
0

Algorithm

목록 보기
13/16

괄호변환

🤖문제 : 괄호변환 Lv2

😎풀이

def process2(w) :
    lst = [0, 0]
    for i, s in enumerate(w) :
        if s == '(' :
            lst[0] += 1
        else :
            lst[1] += 1
        if lst[0] == lst[1] :
            if i+1 == len(w) :
                u, v = w, ""
            else :
                u, v = w[:i+1], w[i+1:]
            return u, v   

def process1(w) :
    if len(w) == 0 :
        return w, True
    return w, False

def is_collect(u) :
    k = 0
    for s in u :
        if s == '(' :
            k += 1
        else :
            k -= 1
        if k < 0 :
            return False
    return True


def get_collect_string(p) :
    w, empty = process1(p)
    # 1. 빈문자열 그대로 반환.
    if empty :
        return answer + w
    else :
        # 2. w -> u + v 분할
        u, v = process2(w)
        # 3. u가 올바른 괄호 문자열인지 확인.
        if is_collect(u) :
            return answer + u + get_collect_string(v)
         # 4. u가 올바른 괄호 문자열이 아닐 경우.
        else :
            k = '(' + get_collect_string(v) + ')'
            for j in u[1:-1] :
                if j == '(' :
                    k += ')'
                else :
                    k += '('
            return k
            

def solution(p) :
    global answer
    answer = ''
    return get_collect_string(p)

👩‍🏫접근 방식

  • 각 단계별로 함수화 하고, 재귀 함수를 통해 전체 단계를 구현.

방금그곡

🤖문제 : 방금그곡 Lv2

😎풀이

def convert_sound_to_int(s) :
    s = s.replace('A#', 'H')
    s = s.replace('C#', 'I')
    s = s.replace('D#', 'J')
    s = s.replace('F#', 'K')
    s = s.replace('G#', 'L')
    return s    
    
def solution(m, musicinfos) :
    r_m = convert_sound_to_int(m)
    # (재생시간, 제목)
    possible_lst = []

    for info in musicinfos : 
        info = info.split(',')
        start, end, title, sound = info[0], info[1], info[2], info[3]
        running_time = (int(end[:2])*60 + int(end[3:])) - (int(start[:2])*60 + int(start[3:]))
        # replace sound 
        r_sound = convert_sound_to_int(sound)
        running_r_sound = r_sound*(running_time//len(r_sound)) + r_sound[:(running_time%len(r_sound))]
        
        if len(r_m) >= 2 :
            for i in range(running_time)[:-len(r_m)+1] :
                if running_r_sound[i:i+len(r_m)] == r_m :
                    possible_lst.append((running_time,title))
        else :
            for i in range(running_time)[:-len(r_m)] :
                if running_r_sound[i:i+len(r_m)] == r_m :
                    possible_lst.append((running_time,title))   
    
    if len(possible_lst) == 0 :
        return "(None)"
    else :
        possible_lst = sorted(possible_lst, key=lambda x : x[0], reverse=True)
        return possible_lst[0][1]

👩‍🏫접근 방식

  • #이 들어간 음표는 2글자 이므로 1글자로 mapping 시킴.
  • 문제 내용대로 구현.

줄 서는 방법

🤖문제 : 줄 서는 방법 Lv2

😎풀이

import numpy as np

def solution(n, k) :
    k -= 1
    answer = [0 for _ in range(n)]
    add_lst =  [i+1 for i in range(n)]
    for i in range(n) :
        idx = k//np.math.factorial(n-i-1)
        answer[i] = add_lst[idx]
        add_lst.pop(idx)
        k = k%np.math.factorial(n-i-1)
    return answer

👩‍🏫접근 방식

  • n_lst = [1, 2, 3, 4 ..., n] 일때
  • i번째 자리의 숫자는 k를 (n-i)!로 나눈 몫을 구하고, n_lst에서 해당 순서의 값으로 입력.
  • n_lst에서 해당 값을 출력, k는 나머지 값으로 업데이트.
  • i+1 번째 자리의 숫자는 k를 (n-(i+1))!으로 나눈 목을 구하고, .... (위와 동일하게 설정.)
profile
AI, Data Scientist 취업 준비생 입니다. 공부한 내용을 포스팅하고자 합니다. 방문해주셔서 감사합니다

0개의 댓글