728x90
반응형

문제 설명

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.

또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.

제한 사항

작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.

작업 진도는 100 미만의 자연수입니다.

작업 속도는 100 이하의 자연수입니다.

배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.

 

문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/42586

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr

풀이 1: 덱으로 풀기

from collections import deque
import math
def solution(progresses, speeds):
    answer = []
    q = []
    for i in range(len(progresses)):
        q.append(math.ceil((100-progresses[i]) / speeds[i]))
    q = deque(q)
    while q:
        cnt = 1
        x = q.popleft()
        temp = 0
        for i in q:
            if i<=x:
                temp += 1
            else: break
        cnt += temp
        for _ in range(temp):
            q.popleft()
        answer.append(cnt)
    return answer

 

풀이2: 덱 없이 리스트에서 수를 전처리 시켜두고 풀기

import math
def solution(progresses, speeds):
    answer = []
    cnt = 1
    q = []
    for i in range(len(progresses)):
        q.append(math.ceil((100-progresses[i]) / speeds[i]))

    for i in range(1, len(q)):
        if q[i-1] >= q[i]:
            q[i] = q[i-1]
    
    for i in range(1, len(q)):        
        if q[i-1]>=q[i]:
            cnt += 1
        else:
            answer.append(cnt)
            cnt = 1
    answer.append(cnt)
    return answer
728x90
반응형
728x90
반응형

문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/42584

코딩테스트 연습 - 주식가격

solution.c 1 #include <stdio.h> 2 #include <stdbool.h> 3 #include <stdlib.h> 4 ​ 5 // prices_len은 배열 prices의 길이입니다. 6 int* solution ( int prices [], size_t prices_len ) { 7 // return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요. 8 int* answer = ( int* ) malloc ( 1 ); 9 return answer ; 10 } 실행 결과 ...

programmers.co.kr

문제 설명

초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.

제한사항

prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.

prices의 길이는 2 이상 100,000 이하입니다.

입출력 예

prices

return

[1, 2, 3, 2, 3]

[4, 3, 1, 1, 0]

비교적 빠른 시간 안에 아이디어를 잡고 구현까지 성공했다.

큐/스택 카테고리에 들어가있던 문제이지만 큐, 스택과는 관계없이 대소관계를 비교하며

이중 반복문으로 풀 수 있었다.

def solution(prices):
    answer = []
    for i in range(len(prices)):
        cnt = 0
        for j in range(i+1, len(prices)):
            cnt +=1
            if prices[i] > prices[j] :
                break
        answer.append(cnt)
    return answer

큐와 스택을 이용해서 푸는 풀이는 없나하고 다른 사람의 문제 풀이를 참조해봤지만

돌아가는 구조 자체는 위와 크게 다르지 않았다.

prices를 deque() 를 이용해서 덱으로 만든 다음 popleft 를 이용해 맨 왼쪽 값을 빼내는 것 정도.

큐/스택은 문제풀이에서 능수능란하게 다루기 어려운 것 같다.

728x90
반응형
728x90
반응형

문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/49993

 

코딩테스트 연습 - 스킬트리

 

programmers.co.kr

문제 설명

선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.

예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.

위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다.

선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.

제한 조건

스킬은 알파벳 대문자로 표기하며, 모든 문자열은 알파벳 대문자로만 이루어져 있습니다.

스킬 순서와 스킬트리는 문자열로 표기합니다.

예를 들어, C → B → D 라면 CBD로 표기합니다

선행 스킬 순서 skill의 길이는 1 이상 26 이하이며, 스킬은 중복해 주어지지 않습니다.

skill_trees는 길이 1 이상 20 이하인 배열입니다.

skill_trees의 원소는 스킬을 나타내는 문자열입니다.

skill_trees의 원소는 길이가 2 이상 26 이하인 문자열이며, 스킬이 중복해 주어지지 않습니다.

입출력 예

skill

skill_trees

return

"CBD"

["BACDE", "CBADF", "AECB", "BDA"]

2

정해진 스킬트리의 순서를 인식하고, 그 스킬트리의 순서에 맞게 스킬을 찍고 있는지를 확인하기 위해

skill문자열을 덱으로 바꿔서 popleft() 를 쓸 수 있게 했다.

저렇게 풀다가 막힌 부분이 CBD의 스킬트리에서 D까지 스킬을 다 찍었을 때 q에 더 이상 요소가 남아있지 않아 popleft()실행 시 IndexError가 발생한다는 점이었는데,

try except문을 사용함과 동시에 스킬트리 순서를 지킨 개수를 answer에 하나씩 더하는 것보다

시작과 동시에 주어진 skill_trees의 개수를 answer에 넣어두고 스킬트리 순서를 지키지 않은 개수를 answer에서 하나씩 빼는 방법으로 접근했다. 코드모양이 조금 길어진 것 같지만 다른 접근방법으로 해결할 수 있어서 기뻤다.

 

from collections import deque
def solution(skill, skill_trees):
    answer = len(skill_trees)
    for tree in skill_trees:        
        q = deque(skill)
        s = q.popleft()
        for v in tree:
            if v in q:
                answer -= 1
                break
            elif s == v:
                try:
                    s = q.popleft()
                except IndexError:
                    break
    return answer
728x90
반응형
728x90
반응형

문제출처 : https://programmers.co.kr/learn/courses/30/lessons/42587

 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린

programmers.co.kr

똑같은 백준 문제 : https://www.acmicpc.net/problem/1966

 

1966번: 프린터 큐

첫 줄에 test case의 수가 주어진다. 각 test case에 대해서 문서의 수 N(100이하)와 몇 번째로 인쇄되었는지 궁금한 문서가 현재 Queue의 어떤 위치에 있는지를 알려주는 M(0이상 N미만)이 주어진다. 다음

www.acmicpc.net

def solution(priorities, location):
    answer = 0
    priorities_copy = [0 for _ in range(len(priorities))]
    priorities_copy[location] = 1 
    while True:
        if priorities[0] == max(priorities):
            answer += 1
            if not priorities_copy[0]:
                del priorities[0] 
                del priorities_copy[0]
            else:break     
        else:
            priorities.append(priorities[0])
            priorities_copy.append(priorities_copy[0])
            del priorities_copy[0]
            del priorities[0]
    return answer

 

다른 사람의 풀이 보기를 해봤더니

python 내장함수인 any함수를 이용해서 푼 신기한 풀이가 있길래 공부가 되었다.

 

any함수를 이용한 풀이코드

def solution(priorities, location):
    queue =  [(i,p) for i,p in enumerate(priorities)]
    answer = 0
    while True:
        cur = queue.pop(0)
        if any(cur[1] < q[1] for q in queue):
            queue.append(cur)
        else:
            answer += 1
            if cur[0] == location:
                return answer

 

python any 함수는 반복 가능한(iterable) 자료형 x를 입력 인수로 받으며 이 x의 요소 중 하나라도 참이 있으면 True를 돌려주고, x가 모두 거짓일 때에만 False를 돌려주는 함수이다. 파이썬의 내장 함수이다.

 

>>> any([0, ""])
False
>>> any([])
False
>>> any([1,2,3,0])
True
728x90
반응형
728x90
반응형

문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/12899

 

코딩테스트 연습 - 124 나라의 숫자

 

programmers.co.kr

문제 설명

124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다.

124 나라에는 자연수만 존재합니다.

124 나라에는 모든 수를 표현할 때 1, 2, 4만 사용합니다.

예를 들어서 124 나라에서 사용하는 숫자는 다음과 같이 변환됩니다.

10진법

124 나라

10진법

124 나라

1

1

6

14

2

2

7

21

3

4

8

22

4

11

9

24

5

12

10

41

자연수 n이 매개변수로 주어질 때, n을 124 나라에서 사용하는 숫자로 바꾼 값을 return 하도록 solution 함수를 완성해 주세요.

제한사항

n은 500,000,000이하의 자연수 입니다.

 

 

def solution(n):
    answer = ''
    answer_list = ["4", "1", "2"]
    while n>0:
        answer = answer_list[n%3] + answer
        if not n%3:
            n = n//3 - 1
        else:
            n //= 3
    
    return answer
728x90
반응형
728x90
반응형

문제 출처 https://programmers.co.kr/learn/courses/30/lessons/42578

 

문제 설명

스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.

스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.

제한사항

clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.

스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.

같은 이름을 가진 의상은 존재하지 않습니다.

clothes의 모든 원소는 문자열로 이루어져 있습니다.

모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.

스파이는 하루에 최소 한 개의 의상은 입습니다.

 

휴 40분 걸렸다

수학문제에 더 가까운 것 같은 문제.

의상카테고리가 하나일 때는 그 카테고리에 있는 개수를 출력하기만 하면 되지만

카테고리의 개수가 3개 이상으로 점점 늘어날수록 한 카테고리의 의상은 아예 선택하지 않는 경우까지 고려해야하다보니 구현을 어떻게 해야할지 통 감이 안와서 시간이 많이 걸렸다.

딕셔너리랑 각 카테고리별 요소 개수를 저장하는 리스트구현까지는 성공했는데

그 이후에 답을 얻어내는 과정을 모르겠어서 결국 답을 치팅했다.

(요소개수 + 1) 의 모든 곱이라니..

치팅하고 나서 공식으로 풀어보니까 위와 같이 기가막히게 똑같이 나왔다.

그래도 딕셔너리 밸류에 리스트를 넣는 등 테크니컬적인 부분에서는 공부가 됐다.

 

def solution(clothes):
    from collections import defaultdict
    d = defaultdict(list)
    def multi(arr):
        ans = 1
        for i in arr:
            ans *= (i+1)
        return ans
    for i in range(len(clothes)):
        d[clothes[i][1]] += [clothes[i][0]]
    lengths = [len(v) for v in d.values()]
    if len(lengths)==1:
        return lengths[0]
    else: return (multi(lengths) -1)
728x90
반응형
728x90
반응형

영업시간 : 매일 오후4시~ 새벽1시

금요일과 토요일은 새벽 2시까지.

 

영등포 맛집 원조부안집 영등포역점


 

영등포에 오랜만에 일이 생겨서 들렀다.

뭘 먹을지 정하지 못한채로 돌아다니다가 고기는 언제먹어도 맛있지하고 들어간

목살 쫀득살 전문 고기집 원조부안집 영등포역점이다.

빈 자리가 없어서 카운터 앞에서 5분정도 잠깐 웨이팅하다가 들어갔다.

나는 들어본 적이 없어서 몰랐는데 이미 티비에도 방영되고

입소문도 꽤 타고 있는 체인점인 것 같았다.

 

QR체크인 하고 들어가기.

불판 주위로 테이블 세팅을 저렇게 해주는 게 신기했다.

고기를 굽기 위해 불을 올리면 저 주변 부분도 같이 달궈진다.

 

쌈장 무쌈 소스 깻잎 소금 등등등 종류가 다양했다.

상추나 깻잎처럼 쌈채소가 없는게 좀 많이 아쉬웠다.

 

 

반합뚜껑처럼 생긴 그릇에 기름만 담겨있길래 소금부어서 기름장 만든 다음에 찍어먹는 건 줄 알았더니

마늘과 콩나물, 파김치를 저기에 한 번에 다 붓고 그릇 통채로 불판 위에 올려서 구운 파김치 식으로 먹는 거였다.

맛은 나쁘지않았지만 손이 막 가는 맛은 아니었다. 파김치를 좋아하는 사람이라면 입맛에 잘 맞을 것 같다.

공기밥이 없고 10분밥이라는 특이한 메뉴가 있다. 준비하는 데에 10분은 족히 걸려서 10분밥이라고 한다.

밥을 같이 먹고 싶어서 주문해봤는데 간장계란밥에 버터를 같이 주는 메뉴였다.

일본에 자주 가서 그런지 간장계란밥은 날달걀을 풀어서 먹는다는 이미지로 굳어져있었는데

계란은 후라이로 나오고 그 위에 김가루를 뿌린 한국식 간장계란밥이 나왔다.

완숙인 계란후라이가 조금 아쉬웠다.... 계란후라이가 반숙이었으면 더 맛있었을 것 같은데..

목살과 쫀득살을 1인분씩 시켰다.

고기 두께가 두껍기는 하지만 배부르기 먹기에는 양이 좀 부족하다.

 

사이드메뉴를 주문하지 않고 고기로만 배부르게 먹으려고 한다면 3, 4인분은 시켜야 할 것 같다.

대신 목살 쫀득살 둘 다 고기는 참 맛있었다.

쫀득살은 이름대로 정말 쫀득해서 맛있었다.

특수부위같은 이름이길래 궁금해서 물어봤더니

뒷다리 옆에 있는 조금 더 쫄깃쫄깃한 부위라고 얘기해주셨다.

 

알바 직원분이 친절하게 응대도 잘해주시고 처음에 고기를 구워주시기 때문에 편하게 먹을 수 있는 것도 좋았다.

특히 여기 김치찌개가 김치도 묵은지고, 들어가는 고기 양도 적지 않은데 그게 정말 맛있다.

김치찌개랑 간장계란밥이랑 같이 먹으면 정말 조합이 좋았다.

술안주로 옆에 시켜두고 먹기도 정말 좋은 맛.

 

셀프바가 운영되고 있는데 테이블이랑 셀프바가 좀 더 깨끗하게 운영됐으면 더 좋았을 것 같은데 아쉬웠다.

삼겹살이나 갈비 말고 색다른 부위의 고기가 먹고 싶을 때 재방문 할 것 같다.

728x90
반응형
728x90
반응형
    • 올바른 괄호

darklight

sublimevimemacs

Python3 

문제 설명

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어

  • ()() 또는 (())() 는 올바른 괄호입니다.
  • )()( 또는 (()( 는 올바르지 않은 괄호입니다.

'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

제한사항

  • 문자열 s의 길이 : 100,000 이하의 자연수
  • 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

입출력 예

sanswer

()() true
(())() true
)()( false
(()( false

입출력 예 설명

입출력 예 #1,2,3,4
문제의 예시와 같습니다

 

 

1차 : 실패한 풀이

def solution(s):
    answer = True
    while True:
        temp = s.replace('()','')
        if s == temp:
            break
        s = temp
    if not s:
        return True
    else: return False

결과는 테스트케이스에서 기대한 값과 같게 나왔지만 시간초과의 이유로 효율성 점수가 낮게 나왔다.

백준에서도 괄호의 완전성을 따지는 비슷한 문제가 있었는데,

그 때도 완전한 괄호를 replace로 바꾸면서 반복했을 때 시간초과가 났던 기억이 있어 다른 방법을 생각했다.

 

2차: 성공

def solution(s):
    t = []
    for i in s:
        if i=="(":
            t.append(i)
        else:
            if t:
                t.pop()
            else: return False
    if t: return False
    else: return True

스택으로 풀면 해결할 수 있다.

728x90
반응형
728x90
반응형

문제 설명

오픈채팅방

카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다.

신입사원인 김크루는 카카오톡 오픈 채팅방을 개설한 사람을 위해, 다양한 사람들이 들어오고, 나가는 것을 지켜볼 수 있는 관리자창을 만들기로 했다. 채팅방에 누군가 들어오면 다음 메시지가 출력된다.

[닉네임]님이 들어왔습니다.

채팅방에서 누군가 나가면 다음 메시지가 출력된다.

[닉네임]님이 나갔습니다.

채팅방에서 닉네임을 변경하는 방법은 다음과 같이 두 가지이다.

  • 채팅방을 나간 후, 새로운 닉네임으로 다시 들어간다.
  • 채팅방에서 닉네임을 변경한다.

닉네임을 변경할 때는 기존에 채팅방에 출력되어 있던 메시지의 닉네임도 전부 변경된다.

예를 들어, 채팅방에 Muzi와 Prodo라는 닉네임을 사용하는 사람이 순서대로 들어오면 채팅방에는 다음과 같이 메시지가 출력된다.

Muzi님이 들어왔습니다.
Prodo님이 들어왔습니다.

채팅방에 있던 사람이 나가면 채팅방에는 다음과 같이 메시지가 남는다.

Muzi님이 들어왔습니다.
Prodo님이 들어왔습니다.
Muzi님이 나갔습니다.

Muzi가 나간후 다시 들어올 때, Prodo 라는 닉네임으로 들어올 경우 기존에 채팅방에 남아있던 Muzi도 Prodo로 다음과 같이 변경된다.

Prodo님이 들어왔습니다.
Prodo님이 들어왔습니다.
Prodo님이 나갔습니다.
Prodo님이 들어왔습니다.

채팅방은 중복 닉네임을 허용하기 때문에, 현재 채팅방에는 Prodo라는 닉네임을 사용하는 사람이 두 명이 있다. 이제, 채팅방에 두 번째로 들어왔던 Prodo가 Ryan으로 닉네임을 변경하면 채팅방 메시지는 다음과 같이 변경된다.

Prodo님이 들어왔습니다.
Ryan님이 들어왔습니다.
Prodo님이 나갔습니다.
Prodo님이 들어왔습니다.

채팅방에 들어오고 나가거나, 닉네임을 변경한 기록이 담긴 문자열 배열 record가 매개변수로 주어질 때, 모든 기록이 처리된 후, 최종적으로 방을 개설한 사람이 보게 되는 메시지를 문자열 배열 형태로 return 하도록 solution 함수를 완성하라.

제한사항

  • record는 다음과 같은 문자열이 담긴 배열이며, 길이는 1 이상 100,000 이하이다.
  • 다음은 record에 담긴 문자열에 대한 설명이다.
    • 모든 유저는 [유저 아이디]로 구분한다.
    • [유저 아이디] 사용자가 [닉네임]으로 채팅방에 입장 - Enter [유저 아이디] [닉네임] (ex. Enter uid1234 Muzi)
    • [유저 아이디] 사용자가 채팅방에서 퇴장 - Leave [유저 아이디] (ex. Leave uid1234)
    • [유저 아이디] 사용자가 닉네임을 [닉네임]으로 변경 - Change [유저 아이디] [닉네임] (ex. Change uid1234 Muzi)
    • 첫 단어는 Enter, Leave, Change 중 하나이다.
    • 각 단어는 공백으로 구분되어 있으며, 알파벳 대문자, 소문자, 숫자로만 이루어져있다.
    • 유저 아이디와 닉네임은 알파벳 대문자, 소문자를 구별한다.
    • 유저 아이디와 닉네임의 길이는 1 이상 10 이하이다.
    • 채팅방에서 나간 유저가 닉네임을 변경하는 등 잘못 된 입력은 주어지지 않는다.

입출력 예

recordresult

["Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"] ["Prodo님이 들어왔습니다.", "Ryan님이 들어왔습니다.", "Prodo님이 나갔습니다.", "Prodo님이 들어왔습니다."]

입출력 예 설명

입출력 예 #1
문제의 설명과 같다.

 

 

def solution(record):
    answer = []
    d = {}
    for i in range(len(record)):
        record[i] = record[i].split()
    for i in range(len(record)):
        if record[i][0] == 'Enter':
            answer.append([record[i][1], '님이 들어왔습니다.'])
            d[record[i][1]] = record[i][2]
        elif record[i][0] == 'Leave':
            answer.append([record[i][1], '님이 나갔습니다.'])
        elif record[i][0] == 'Change':
            d[record[i][1]] = record[i][2]
    for i in range(len(answer)):
        answer[i][0] = d[answer[i][0]]
        answer[i] = ''.join(answer[i])
    return answer

 

유저ID와 닉네임을 연동할 필요성이 있음을 느껴 딕셔너리를 이용했다.

answer 리스트 안에 1차적으로 user id를 저장해두고

Enter 나 Change를 통해 닉네임이 변경된 것이 있다면 변경사항이 적용되도록 했다.

split으로 분리해놓은 문자열 배열을 ''.join을 통해 다시 합쳤다.

728x90
반응형
728x90
반응형

https://www.acmicpc.net/problem/1699

 

1699번: 제곱수의 합

어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다

www.acmicpc.net

 

x = int(input()) 
dp = [0] * (x+1) 
for i in range(1, x+1): 
    dp[i] = i 
    for j in range(1, i): 
        if (j * j) > i: 
            break 
        dp[i] = min(dp[i], dp[i - j**2] + 1) 

print(dp[x])

 

python으로 제출하면 시간초과가 난다. pypy3으로 제출했다.

32, 64, 128 등의 반례를 찾았기 때문에

가까운 제곱수 항 개수를 생각하는 것이 아니라

여태까지 나온 모든 제곱수 항을 확인해봐야한다는 것에 착안해야한다.

 

728x90
반응형

+ Recent posts