반응형

출처 : 프로그래머스

 

코딩테스트 연습 - 베스트앨범

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가

programmers.co.kr

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다.

  1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
  2. 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
  3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.

노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 plays가 주어질 때, 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return 하도록 solution 함수를 완성하세요.

제한사항

  • genres[i]는 고유번호가 i인 노래의 장르입니다.
  • plays[i]는 고유번호가 i인 노래가 재생된 횟수입니다.
  • genres와 plays의 길이는 같으며, 이는 1 이상 10,000 이하입니다.
  • 장르 종류는 100개 미만입니다.
  • 장르에 속한 곡이 하나라면, 하나의 곡만 선택합니다.
  • 모든 장르는 재생된 횟수가 다릅니다.

입출력 예

genresplaysreturn

["classic", "pop", "classic", "classic", "pop"] [500, 600, 150, 800, 2500] [4, 1, 3, 0]

입출력 예 설명

classic 장르는 1,450회 재생되었으며, classic 노래는 다음과 같습니다.

  • 고유 번호 3: 800회 재생
  • 고유 번호 0: 500회 재생
  • 고유 번호 2: 150회 재생

pop 장르는 3,100회 재생되었으며, pop 노래는 다음과 같습니다.

  • 고유 번호 4: 2,500회 재생
  • 고유 번호 1: 600회 재생

따라서 pop 장르의 [4, 1]번 노래를 먼저, classic 장르의 [3, 0]번 노래를 그다음에 수록합니다.

※ 공지 - 2019년 2월 28일 테스트케이스가 추가되었습니다.

 

최종풀이 :

def solution(genres, plays):
    answer = []
    dic = {}
    for idx, genre in enumerate(genres):
        dic[genre] = dic.get(genre, 0) + plays[idx]
    #sorted(d.items(), key=lambda x: x[1], reverse=True)
    dic  = sorted(dic.items(), key = lambda x: x[1], reverse= True)
    #['pop', 'classic']
    genre_play = list(enumerate(list(zip(genres, plays))))
    # [(0, ('classic', 500)), (1, ('pop', 600)), (2, ('classic', 150)), (3, ('classic', 800)), (4, ('pop', 2500))]
    genre_play.sort( key = lambda x: x[1], reverse = True )
    # [(4, ('pop', 2500)), (1, ('pop', 600)), (3, ('classic', 800)), (0, ('classic', 500)), (2, ('classic', 150))]
    #print(genre_play)
    
    for key, value in dic:
        count = 0
        for (idx, (genre, play)) in genre_play:
            if genre == key:
                answer.append(idx)
                count += 1
                if count >= 2:
                    break
    return answer

genres = ["classic", "pop", "classic", "classic", "pop"]
plays = [500, 600, 150, 800, 600]
assert solution(genres, plays) == [3, 0, 1, 4], solution(genres, plays)
처음에는  3번, 4번 , 15번 만 통과하였다. 
dic  = sorted(dic.keys(), key = lambda x: x[1], reverse= True)
로 해주어셔 그렇다. 

dic  = sorted(dic.items(), key = lambda x: x[1], reverse= True)

로 수정하였더니 통과 하였다. 

 

반응형

'문제 > 프로그래머스' 카테고리의 다른 글

주식가격  (0) 2022.06.07
다리를 지나는 트럭  (0) 2022.06.02
[Lv.1] 하샤드 수  (0) 2022.05.06
124 나라의 숫자  (0) 2022.04.27
튜플  (0) 2022.04.27
반응형

출처 : 프로그래머스

 

코딩테스트 연습 - 하샤드 수

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하

programmers.co.kr

문제 설명

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.

제한 조건
  • x는 1 이상, 10000 이하인 정수입니다.
입출력 예arrreturn
10 true
12 true
11 false
13 false
입출력 예 설명

입출력 예 #1
10의 모든 자릿수의 합은 1입니다. 10은 1로 나누어 떨어지므로 10은 하샤드 수입니다.

입출력 예 #2
12의 모든 자릿수의 합은 3입니다. 12는 3으로 나누어 떨어지므로 12는 하샤드 수입니다.

입출력 예 #3
11의 모든 자릿수의 합은 2입니다. 11은 2로 나누어 떨어지지 않으므로 11는 하샤드 수가 아닙니다.

입출력 예 #4
13의 모든 자릿수의 합은 4입니다. 13은 4로 나누어 떨어지지 않으므로 13은 하샤드 수가 아닙니다.

 

def solution(x):
    answer = (x % sum(list(map(int, str(x))))) == 0
    return answer

x = 11
solution(x)

3점을 받았다. 

반응형

'문제 > 프로그래머스' 카테고리의 다른 글

다리를 지나는 트럭  (0) 2022.06.02
베스트앨범  (0) 2022.05.19
124 나라의 숫자  (0) 2022.04.27
튜플  (0) 2022.04.27
위장  (0) 2022.04.21
반응형

출처 : 프로그래머스

 

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

 

programmers.co.kr

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

  1. 124 나라에는 자연수만 존재합니다.
  2. 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이하의 자연수 입니다.

입출력 예

nresult

1 1
2 2
3 4
4 11
def solution(n):
    answer = ''
    number = [1, 2, 4]
    numbers = []
    n_ = n
    while n > 3:
        div, mod = divmod(n, len(number))
        if mod == 0:
            numbers.insert(0, 3)
            n = div - 1
        else:
            numbers.insert(0, mod)
            n = div
    numbers.insert(0, n)
    #print(n_, n, numbers, [str(number[i-1]) for i in numbers])
    answer= "".join([str(number[i-1]) for i in numbers])
    return answer

for n in range(1, 17):
    print(n, solution(n))
    solution(n)

반응형

'문제 > 프로그래머스' 카테고리의 다른 글

베스트앨범  (0) 2022.05.19
[Lv.1] 하샤드 수  (0) 2022.05.06
튜플  (0) 2022.04.27
위장  (0) 2022.04.21
동물 수 구하기_MySQL  (0) 2022.04.17
반응형

출처 : 프로그래머스

 

코딩테스트 연습 - 튜플

"{{2},{2,1},{2,1,3},{2,1,3,4}}" [2, 1, 3, 4] "{{1,2,3},{2,1},{1,2,4,3},{2}}" [2, 1, 3, 4] "{{4,2,3},{3},{2,3,4,1},{2,3}}" [3, 2, 4, 1]

programmers.co.kr

문제 설명

셀수있는 수량의 순서있는 열거 또는 어떤 순서를 따르는 요소들의 모음을 튜플(tuple)이라고 합니다. n개의 요소를 가진 튜플을 n-튜플(n-tuple)이라고 하며, 다음과 같이 표현할 수 있습니다.

  • (a1, a2, a3, ..., an)

튜플은 다음과 같은 성질을 가지고 있습니다.

  1. 중복된 원소가 있을 수 있습니다. ex : (2, 3, 1, 2)
  2. 원소에 정해진 순서가 있으며, 원소의 순서가 다르면 서로 다른 튜플입니다. ex : (1, 2, 3) ≠ (1, 3, 2)
  3. 튜플의 원소 개수는 유한합니다.

원소의 개수가 n개이고, 중복되는 원소가 없는 튜플 (a1, a2, a3, ..., an)이 주어질 때(단, a1, a2, ..., an은 자연수), 이는 다음과 같이 집합 기호 '{', '}'를 이용해 표현할 수 있습니다.

  • {{a1}, {a1, a2}, {a1, a2, a3}, {a1, a2, a3, a4}, ... {a1, a2, a3, a4, ..., an}}

예를 들어 튜플이 (2, 1, 3, 4)인 경우 이는

  • {{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}

와 같이 표현할 수 있습니다. 이때, 집합은 원소의 순서가 바뀌어도 상관없으므로

  • {{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}
  • {{2, 1, 3, 4}, {2}, {2, 1, 3}, {2, 1}}
  • {{1, 2, 3}, {2, 1}, {1, 2, 4, 3}, {2}}

는 모두 같은 튜플 (2, 1, 3, 4)를 나타냅니다.

특정 튜플을 표현하는 집합이 담긴 문자열 s가 매개변수로 주어질 때, s가 표현하는 튜플을 배열에 담아 return 하도록 solution 함수를 완성해주세요.

[제한사항]

  • s의 길이는 5 이상 1,000,000 이하입니다.
  • s는 숫자와 '{', '}', ',' 로만 이루어져 있습니다.
  • 숫자가 0으로 시작하는 경우는 없습니다.
  • s는 항상 중복되는 원소가 없는 튜플을 올바르게 표현하고 있습니다.
  • s가 표현하는 튜플의 원소는 1 이상 100,000 이하인 자연수입니다.
  • return 하는 배열의 길이가 1 이상 500 이하인 경우만 입력으로 주어집니다.

[입출력 예]sresult
"{{2},{2,1},{2,1,3},{2,1,3,4}}" [2, 1, 3, 4]
"{{1,2,3},{2,1},{1,2,4,3},{2}}" [2, 1, 3, 4]
"{{20,111},{111}}" [111, 20]
"{{123}}" [123]
"{{4,2,3},{3},{2,3,4,1},{2,3}}" [3, 2, 4, 1]
입출력 예에 대한 설명입출력 예 #1

문제 예시와 같습니다.

입출력 예 #2

문제 예시와 같습니다.

입출력 예 #3

(111, 20)을 집합 기호를 이용해 표현하면 {{111}, {111,20}}이 되며, 이는 {{20,111},{111}}과 같습니다.

입출력 예 #4

(123)을 집합 기호를 이용해 표현하면 {{123}} 입니다.

입출력 예 #5

(3, 2, 4, 1)을 집합 기호를 이용해 표현하면 {{3},{3,2},{3,2,4},{3,2,4,1}}이 되며, 이는 {{4,2,3},{3},{2,3,4,1},{2,3}}과 같습니다.

이런 순서로 바꾸는 것이 힌트이다. 

  • {{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}

이 부분은 아래 주소를 참조하였다.

 

https://hazung.tistory.com/103

 

[알고리즘] 프로그래머스 튜플 / python

https://programmers.co.kr/learn/courses/30/lessons/64065 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업

hazung.tistory.com

import re
def solution(s):
    answer = []
    # {}안에 있는 것을 len으로 정렬한다. 
    s = s.split(',{')
    s.sort(key = len)
    s = ",{".join(s)

    re_s = re.findall("\d+", s)
    for i in re_s:
        i = int(i)
        if i not in answer:
            answer.append(i)

    return answer

s = "{{2},{2,1},{2,1,3},{2,1,3,4}}"
solution(s)
반응형

'문제 > 프로그래머스' 카테고리의 다른 글

[Lv.1] 하샤드 수  (0) 2022.05.06
124 나라의 숫자  (0) 2022.04.27
위장  (0) 2022.04.21
동물 수 구하기_MySQL  (0) 2022.04.17
전화번호 목록  (0) 2022.04.17
반응형

출처: 프로그래머스

 

코딩테스트 연습 - 위장

 

programmers.co.kr

문제 설명

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

예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.

종류이름
얼굴 동그란 안경, 검정 선글라스
상의 파란색 티셔츠
하의 청바지
겉옷 긴 코트

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

제한사항
  • clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
  • 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.
  • 같은 이름을 가진 의상은 존재하지 않습니다.
  • clothes의 모든 원소는 문자열로 이루어져 있습니다.
  • 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.
  • 스파이는 하루에 최소 한 개의 의상은 입습니다.
입출력 예clothesreturn
[["yellowhat", "headgear"], ["bluesunglasses", "eyewear"], ["green_turban", "headgear"]] 5
[["crowmask", "face"], ["bluesunglasses", "face"], ["smoky_makeup", "face"]] 3
입출력 예 설명

예제 #1
headgear에 해당하는 의상이 yellow_hat, green_turban이고 eyewear에 해당하는 의상이 blue_sunglasses이므로 아래와 같이 5개의 조합이 가능합니다.

1. yellow_hat
2. blue_sunglasses
3. green_turban
4. yellow_hat + blue_sunglasses
5. green_turban + blue_sunglasses

예제 #2
face에 해당하는 의상이 crow_mask, blue_sunglasses, smoky_makeup이므로 아래와 같이 3개의 조합이 가능합니다.

1. crow_mask
2. blue_sunglasses
3. smoky_makeup

해시 문제이다. 

def solution(clothes):
    answer = 1
    dict_= {}
    for value, key in clothes:
        if not dict_.get(key):
            dict_[key] = 1
        else:
            dict_[key] += 1
    for value in dict_.values():
        answer *= (value + 1)
    return answer - 1

clothes = [["yellowhat", "headgear"], ["bluesunglasses", "eyewear"], ["green_turban", "headgear"]]
solution(clothes)

수학식을 참고해서 하였다 .

https://programmers.co.kr/questions/20274

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

반응형

'문제 > 프로그래머스' 카테고리의 다른 글

124 나라의 숫자  (0) 2022.04.27
튜플  (0) 2022.04.27
동물 수 구하기_MySQL  (0) 2022.04.17
전화번호 목록  (0) 2022.04.17
더 맵게  (0) 2022.03.29
반응형

출처 : 프로그래머스

 

코딩테스트 연습 - 동물 수 구하기

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

문제 설명

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

NAMETYPENULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
INTAKE_CONDITION VARCHAR(N) FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_INTAKE VARCHAR(N) FALSE

동물 보호소에 동물이 몇 마리 들어왔는지 조회하는 SQL 문을 작성해주세요.

예시

예를 들어 ANIMAL_INS 테이블이 다음과 같다면

ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKE
A399552 Dog 2013-10-14 15:38:00 Normal Jack Neutered Male
A379998 Dog 2013-10-23 11:42:00 Normal Disciple Intact Male
A370852 Dog 2013-11-03 15:04:00 Normal Katie Spayed Female
A403564 Dog 2013-11-18 17:03:00 Normal Anna Spayed Female

동물 보호소에 들어온 동물은 4마리입니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.

count
4

※ 컬럼 이름(위 예제에서는 count)은 일치하지 않아도 됩니다.


본 문제는 Kaggle의 "Austin Animal Center Shelter Intakes and Outcomes"에서 제공하는 데이터를 사용하였으며 ODbL의 적용을 받습니다.

 

-- 코드를 입력하세요
SELECT COUNT(ANIMAL_ID) count
FROM ANIMAL_INS
반응형

'문제 > 프로그래머스' 카테고리의 다른 글

튜플  (0) 2022.04.27
위장  (0) 2022.04.21
전화번호 목록  (0) 2022.04.17
더 맵게  (0) 2022.03.29
순위  (0) 2022.03.29
반응형

출처: 프로그래머스

 

코딩테스트 연습 - 전화번호 목록

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조

programmers.co.kr

문제 설명

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.

  • 구조대 : 119
  • 박준영 : 97 674 223
  • 지영석 : 11 9552 4421

전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.

제한 사항
  • phone_book의 길이는 1 이상 1,000,000 이하입니다.
    • 각 전화번호의 길이는 1 이상 20 이하입니다.
    • 같은 전화번호가 중복해서 들어있지 않습니다.
입출력 예제phone_bookreturn
["119", "97674223", "1195524421"] false
["123","456","789"] true
["12","123","1235","567","88"] false
입출력 예 설명

입출력 예 #1
앞에서 설명한 예와 같습니다.

입출력 예 #2
한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.

입출력 예 #3
첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.


알림

2021년 3월 4일, 테스트 케이스가 변경되었습니다. 이로 인해 이전에 통과하던 코드가 더 이상 통과하지 않을 수 있습니다.

 

def solution(phone_book):
    answer = True
    phone_book_sort = sorted(phone_book)
    for i in range(1, len(phone_book_sort)):
        if phone_book_sort[i-1] == phone_book_sort[i][:len(phone_book_sort[i-1])]:
            answer = False
            break
    return answer

 

 

참조 :

https://theamabile.tistory.com/22

 

[프로그래머스] 전화번호 목록

[21-05-29] 비교적 익숙한 해시..!! 한번에 퍼펙트하게 풀진 못했지만 그래도 다른 알고리즘 문제보단 비교적 빠르게 풀었다 문제 전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인

theamabile.tistory.com

https://velog.io/@rudnf003/python-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%95%B4%EC%8B%9C-%EC%A0%84%ED%99%94%EB%B2%88%ED%98%B8-%EB%AA%A9%EB%A1%9D

 

[python] 프로그래머스 해시 전화번호 목록

📋 문제 전화번호 목록 문제 설명 전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이

velog.io

 

반응형

'문제 > 프로그래머스' 카테고리의 다른 글

위장  (0) 2022.04.21
동물 수 구하기_MySQL  (0) 2022.04.17
더 맵게  (0) 2022.03.29
순위  (0) 2022.03.29
정수 삼각형  (0) 2022.03.12
반응형

출처 : 프로그래머스 

 

코딩테스트 연습 - 더 맵게

매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같

programmers.co.kr

문제 설명

매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다.

섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)

Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다.
Leo가 가진 음식의 스코빌 지수를 담은 배열 scoville과 원하는 스코빌 지수 K가 주어질 때, 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 return 하도록 solution 함수를 작성해주세요.

제한 사항
  • scoville의 길이는 2 이상 1,000,000 이하입니다.
  • K는 0 이상 1,000,000,000 이하입니다.
  • scoville의 원소는 각각 0 이상 1,000,000 이하입니다.
  • 모든 음식의 스코빌 지수를 K 이상으로 만들 수 없는 경우에는 -1을 return 합니다.
입출력 예scovilleKreturn
[1, 2, 3, 9, 10, 12] 7 2
입출력 예 설명
  1. 스코빌 지수가 1인 음식과 2인 음식을 섞으면 음식의 스코빌 지수가 아래와 같이 됩니다.
    새로운 음식의 스코빌 지수 = 1 + (2 * 2) = 5
    가진 음식의 스코빌 지수 = [5, 3, 9, 10, 12]
  2. 스코빌 지수가 3인 음식과 5인 음식을 섞으면 음식의 스코빌 지수가 아래와 같이 됩니다.
    새로운 음식의 스코빌 지수 = 3 + (5 * 2) = 13
    가진 음식의 스코빌 지수 = [13, 9, 10, 12]

모든 음식의 스코빌 지수가 7 이상이 되었고 이때 섞은 횟수는 2회입니다.

풀이 과정 소개:

import heapq
def solution(scoville, K):
    answer = 0
    heapq.heapify(scoville)
    while True:
        scoville_min = heapq.heappop(scoville)
        if scoville_min > K:
            break
        else:
            answer += 1
            scoville_min2 = heapq.heappop(scoville)
            scoville_value = scoville_min + scoville_min2*2
            heapq.heappush(scoville, scoville_value)
    #print(scoville)

    return answer

문제 1, 3, 8, 14가 오류 난다.

		if answer == 0:
        return -1

추가해도 여전히 같다.

import heapq
def solution(scoville, K):
    answer = 0
    heapq.heapify(scoville)
    while len(scoville) > 2:
        scoville_min = heapq.heappop(scoville)
        if scoville_min > K:
            break
        else:
            answer += 1
            scoville_min2 = heapq.heappop(scoville)
            scoville_value = scoville_min + scoville_min2*2
            heapq.heappush(scoville, scoville_value)
    #print(scoville)
    
    if answer == 0:
        return -1
    
    return answer

수정했더니 1, 3, 6, 14, 16 더 많이 틀렸다

아래와 같이 하면 된다.

최종 소스는

import heapq
def solution(scoville, K):
    answer = 0
    heapq.heapify(scoville)
    while scoville[0] < K:
        if len(scoville) > 1:
            scoville_min = heapq.heappop(scoville)
            scoville_min2 = heapq.heappop(scoville)
            scoville_value = scoville_min + scoville_min2*2
            heapq.heappush(scoville, scoville_value)
            answer += 1
        else:
            return -1
    #print(scoville)
    
    return answer

scoville = [1, 2, 3, 9, 10, 12]
K = 7
solution(scoville, K)
반응형

'문제 > 프로그래머스' 카테고리의 다른 글

동물 수 구하기_MySQL  (0) 2022.04.17
전화번호 목록  (0) 2022.04.17
순위  (0) 2022.03.29
정수 삼각형  (0) 2022.03.12
가장 큰 수  (0) 2022.03.08

+ Recent posts