10/30 프로그래머스 Level 2 숙제

imyo·2020년 10월 30일
1

알고리즘

목록 보기
39/39
post-thumbnail

멀쩡한 사각형

import math
def solution(w,h):
    # answer = 0
    # for i in range(1,h+1):
    #     a = w * i/h
    #     answer += w - math.ceil(a)
    # return 2*answer
    
    mn = min(w,h)
    mx = max(w,h)
    pre = 0
    throw = 0
    for i in range(1,mn+1):
        now = mx * i/mn
        throw += math.ceil(now) - math.floor(pre)
        pre = now
        if math.floor(now) == math.ceil(now):
            answer = (mn/i) * (mx*i - throw)
            break
    return answer

124 나라의 숫자

def solution(n):
    answer = ''
    a = n
    b = 0
    while a>0:
        b = (a-1)%3
        a = (a-1)//3
        if b == 0:
            answer += '1'
        elif b == 1:
            answer += '2'
        elif b == 2:
            answer += '4'
    answer = ''.join(reversed(list(answer)))
    return answer

스킬트리

def solution(skill, skill_trees):
    answer = 0
    for i in skill_trees:
        skill_order = ''
        for j in i:
            if j in skill:
                skill_order+=j
        if skill_order == skill[:len(skill_order)]:
            answer += 1
    return answer

삼각 달팽이

def solution(n):
    answer = []
    a = []
    for i in range(1, n+1):
        a.append([0 for j in range(i)])
    i = 0
    j = 0
    mode = 0
    for k in range(1, n*(n+1)//2+1):
        a[i][j] = k
        if mode == 0:
            if i+1 == n or a[i+1][j] != 0:
                mode = 1
                j+=1
            else:
                i+=1
        elif mode == 1:
            if j+1 == len(a[i]) or a[i][j+1] != 0:
                mode = 2
                i-=1
                j-=1
            else:
                j+=1
        elif mode == 2:
            if a[i-1][j-1] != 0:
                mode = 0
                i+=1
            else:
                i-=1
                j-=1
    for i in a:
        for j in i:
            answer.append(j)
    return answer

문자열 압축

def solution(s):
    answer = len(s)
    for i in range(1, len(s)//2+1):
        pre = s[:i]
        idx = i
        temp = ''
        count = 1
        while idx <= len(s)-i:
            now = s[idx:idx+i]
            if pre == now:
                count += 1
            else:
                # if count != 1:
                #     temp += str(count)+pre
                # else:
                #     temp += pre
                temp += (str(count) if count>1 else '')+pre
                count = 1
            pre = now
            idx += i
        if count != 1:
            temp += str(count)+pre+s[idx:]
        else:
            temp += pre+s[idx:]
        
        if len(temp) < answer:
            answer = len(temp)
    return answer

더 맵게

import heapq as hq
def solution(scoville, K):
    answer = 0
    hq.heapify(scoville)
    while scoville:
        first = hq.heappop(scoville)
        if first >= K:
            break
        if not scoville:
            return -1
        second = hq.heappop(scoville)
        answer += 1
        hq.heappush(scoville, first+2*second)
    return answer

괄호 변환

def solution(p):
    answer = editString(p)
    return answer

def checkCorrect(p):
    stack = []
    for i in p:
        if i == '(':
            stack.append(i)
        else:
            if stack and stack[-1] == '(':
                stack.pop()
            else:
                stack.append(i)
    if not stack:
        return True
    else:
        return False
    
def editString(p):
    if not p:
        return ''
    a = 0
    b = 0
    for i, v in enumerate(p):
        if v == '(':
            a += 1
        else:
            b += 1
        if a == b:
            u = p[:i+1]
            v = p[i+1:]
            break
    if checkCorrect(u):
        return u+editString(v)
    else:
        temp = ''
        for i in u[1:-1]:
            if i == '(':
                temp += ')'
            else:
                temp += '('
        return '('+editString(v)+')'+temp

타겟 넘버

def solution(numbers, target):
    answer = 0
    a = []
    result = []
    stack = [[-1,0]]
    while stack:
        temp = stack.pop()
        result = result[:temp[0]+1]
        result.append(temp[1])
        if temp[0] < len(numbers)-1:
            stack.append([temp[0]+1, numbers[temp[0]+1]])
            stack.append([temp[0]+1, -numbers[temp[0]+1]])
        else:
            a.append(result[:])
    for i in a:
        if sum(i) == target:
            answer += 1
    return answer

가장 큰 정사각형 찾기

def solution(board):
    answer = 0
#    완전탐색
#     w_max = max([i.count(1) for i in board])
#     temp = [0 for i in board[0]]
#     for i in board:
#         for j, v in enumerate(i):
#             if v == 1:
#                 temp[j] += 1
#     h_max = max(temp)
    
#     n = min(w_max, h_max)
#     for i in range(n,0,-1):
#         for j in range(len(board)-i+1):
#             for k in range(len(board[0])-i+1):
#                 temp = [x[k:k+i] for x in board[j:j+i]]
#                 flag = True
#                 for a in temp:
#                     if 0 in a:
#                         flag = False
#                         break
#                 if flag:
#                     return i*i

    for i in range(1, len(board)):
        for j in range(1, len(board[i])):
            if board[i][j] != 0:
                board[i][j] += min(board[i-1][j-1], board[i-1][j], board[i][j-1])
    #answer = max(list(map(max, board))) ** 2
    answer = max([max(x) for x in board]) ** 2
    return answer

올바른 괄호

def solution(s):
    stack = []
    for i in s:
        if i == '(':
            stack.append(i)
        else:
            if stack and stack[-1] == '(':
                stack.pop()
            else:
                stack.append(i)
    if not stack:
        return True
    else:
        return False

튜플

def solution(s):
    answer = []
    StoList = []
    tempNum = ''
    tempList = []
    for i in s[1:-1]:
        if i!=',' and i!='{' and i!='}':
            tempNum += i
        else:
            if tempNum != '':
                tempList.append(int(tempNum))
                tempNum = ''
            if i=='}':
                StoList.append(tempList)
                tempList = []
    StoList.sort(key=len)
    for i in StoList:
        for j in i:
            if j not in answer:
                answer.append(j)
    return answer

다음 큰 숫자

def solution(n):
    a = n+1
    binN = list(bin(n))[2:]
    one = binN.count('1')
    while True:
        binA = list(bin(a))[2:]
        if binA.count('1') == one:
            return a
        else:
            a += 1

땅따먹기

def solution(land):
    answer = 0
    score = land[0]
    for i in range(1, len(land)):
        scoreTemp = score[:]
        for j in range(len(land[i])):
            maxScore = max([scoreTemp[k] for k in range(len(scoreTemp)) if k != j]) + land[i][j]
            score[j] = maxScore
            print(score, scoreTemp)
    
    answer = max(score)
    return answer

폰켓몬

def solution(nums):
    n = len(nums)//2
    s = set(nums)
    return n if n<len(s) else len(s)

숫자의 표현

def solution(n):
    answer = 0
    for i in range(1, n//2+1):
        num = i
        temp = 0
        while True:
            temp += num
            if temp == n:
                answer += 1
            elif temp > n:
                break
            num += 1
    return answer+1

최솟값 구하기

SELECT min(datetime) from animal_ins

최댓값과 최솟값

def solution(s):
    answer = ''
    lst = list(map(int, s.split(' ')))
    return answer+str(min(lst))+' '+str(max(lst))

최솟값 만들기

def solution(A,B):
    answer = 0
    A.sort()
    B.sort(reverse=True)
    for i in range(len(A)):
        answer += A[i]*B[i]
    return answer
profile
(●⁰౪⁰●)

0개의 댓글