문제 : https://programmers.co.kr/learn/courses/30/lessons/42747

 

코딩테스트 연습 - H-Index

H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다. 어떤 과학자가 발표

programmers.co.kr

▶ 코드

def solution(citations):

    ans = []   
    citations.sort() # [0,1,3,5,6]
    #print(citations)
    
    for i in range(1, len(citations)+1): # 1번~N번 인용
        for j in range(len(citations)):
            if i <= citations[j]: # 인용횟수i 보다 크거나 같은 배열원소 찾으면 
                if len(citations[j:]) < i : # 원소갯수가 인용횟수보다 낮다면 
                    break # 다음 i로 넘어가기 
                else: # 원소갯수가 인용회수 '이상' 이라면(=같거나 크다면)
                    ans.append(i)
               
    #print(ans)
    if len(ans) == 0: # 예외처리 
        return 0
    else:
        return max(ans)
        
#solution([3,0,6,1,5])
#solution([5,5,5,5,5])

'[프로그래머스] 코테 고득점 Kit > 정렬' 카테고리의 다른 글

[Level 1] K번째수  (0) 2020.05.16

문제 : https://programmers.co.kr/learn/courses/30/lessons/42748

 

코딩테스트 연습 - K번째수

[1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [1, 7, 3]] [5, 6, 3]

programmers.co.kr

▶ 코드

import copy

def solution(array, commands):
    res = []
    for a in commands:
        tmp = copy.deepcopy(array)
        tmp = tmp[a[0]-1:a[1]]
        tmp.sort()
        res.append(tmp[a[2]-1])
    return res

#solution([1,5,2,6,3,7,4], [[2,5,3],[4,4,1],[1,7,3]])

'[프로그래머스] 코테 고득점 Kit > 정렬' 카테고리의 다른 글

[Level 2] H-Index  (0) 2020.05.16

문제 : https://programmers.co.kr/learn/courses/30/lessons/42579

 

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

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

programmers.co.kr

딕셔너리 value값으로 정렬 하기 : https://kkamikoon.tistory.com/138

 

[Python] 딕셔너리 정렬하기

파이썬 딕셔너리에 입력된 key 값과 value 값들을 정렬해야 할 때가 있습니다. 그럴 때 해결할 수 있는 방법을 사용해보려고 합니다. 각각 Key를 이용한 방법과 Value를 이용한 방법이 있습니다. 딕셔

kkamikoon.tistory.com

→ 딕셔너리를 정렬하는 순간 리스트 형태로 바뀐다.

 

▶ 코드

# 장르별로 두개씩 모아 베스트 앨범을 출시 

import operator

def solution(genres, plays):
    ans = []
    dic = {}
    for a, b in zip(genres, plays):
        if a in dic.keys():
            dic[a] += b
        else:
            dic[a] = b
    #print(dic) # {'classic': 1450, 'pop': 3100}
    sdic = sorted(dic.items(), key=operator.itemgetter(1), reverse=True)
    #print(sdic) # [('pop', 3100), ('classic', 1450)]
    for a in sdic:
        c = 0
        target = a[0]
        #print(target)
        tmp_dic = {}
        index = -1
        for i in range(len(genres)):
            
            if genres[i] == target:
                index = i
                tmp_dic[index] = plays[index]
        #print(tmp_dic) # {1: 600, 4: 2500}
        #print(index)
                
        if len(tmp_dic) == 1:
            ans.append(index)
            continue

        tmp_dic = sorted(tmp_dic.items(), key=operator.itemgetter(1), reverse=True)
        #print(tmp_dic) # [(4, 2500), (5, 2500), (1, 600)]
        c = 0
        i = 0
        while c < 2:
            ans.append(tmp_dic[i][0])
            c += 1
            i += 1
    #print(ans)
    return ans        

#solution(['classic', 'pop', 'classic', 'classic', 'pop', 'pop'], [500, 600, 150, 800, 2500, 2500])
#solution(['classic','pop','classic','classic','pop'],[500,600,501,800,900])

문제 : https://programmers.co.kr/learn/courses/30/lessons/42577

 

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

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

programmers.co.kr

▶ 코드

def solution(phone_book):
    
    phone_book.sort()  # 숫자로된 문자열을 sort()하면, 앞 숫자 순서대로 정렬.. 
    #print(phone_book) # ['119', '11955678484', '7777', '9876532']

    for p1, p2 in zip(phone_book, phone_book[1:]): # ['119', '11955678484', '7777', '9876532'] 와 ['11955678484', '7777', '9876532']이 하나씩 짝을 이룸
        #print(p1, p2)
        if p2.startswith(p1):
            return False
    return True

#solution(["7777", "119","9876532","11955678484"])

'[프로그래머스] 코테 고득점 Kit > 해시' 카테고리의 다른 글

[Level 3] 베스트앨범  (0) 2020.05.16
[Level 1] 완주하지 못한 선수  (0) 2020.05.16

문제 : https://programmers.co.kr/learn/courses/30/lessons/42576

 

코딩테스트 연습 - 완주하지 못한 선수

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수��

programmers.co.kr

▶ 코드

from collections import Counter

def solution(p, c):
    p_counter = Counter(p)
    c_counter = Counter(c)

    for a in p_counter.keys():
        if p_counter[a] != c_counter[a]:
            return str(a)

#solution(['mislav', 'stanko', 'mislav', 'ana'], ['stanko', 'ana', 'mislav'])

'[프로그래머스] 코테 고득점 Kit > 해시' 카테고리의 다른 글

[Level 3] 베스트앨범  (0) 2020.05.16
[Level 2] 전화번호 목록  (0) 2020.05.16

문제 : https://programmers.co.kr/learn/courses/30/lessons/42842

 

코딩테스트 연습 - 카펫

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다. Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 ��

programmers.co.kr

▶ 코드

def solution(brown, yellow):
    s = brown+yellow

    # 합 :조합 구하기
    temp1 = []
    for i in range(3, s+1):
        flag = 0
        if s%i == 0:
            flag = 1
            left = s//i
            right = i
        if flag==1 and left >= right:
            temp1.append([left,right])

    # yellow 조합 구하기
    temp2 = []
    for i in range(1, yellow+1):
        flag = 0
        if yellow%i == 0:
            flag = 1
            left = yellow//i
            right = i
        if flag==1:
            temp2.append([left, right])

    #print('합 = ',temp1)
    #print('yellow=', temp2)
    #print()

    # yellow와 합 리스트 하나씩 비교
    # 조건: yellow의 left,right는 '합'의 left,right보다 둘다 무조건 작고,
    #       yellow의 left, right보다 '합'의 left,right는 항상 각각 2이상 커야한다.

    for a in temp2: # yellow
        for b in temp1: # '합'
            if a[0]+2 <= b[0] and a[1]+2 <= b[1]:
                res = [b]
                #print(res[0])
                return res[0]
                break
        


#solution(10, 2)
#solution(8, 1)
#solution(24, 24)

 

 

'[프로그래머스] 코테 고득점 Kit > 완전탐색' 카테고리의 다른 글

[Level 2] 소수 찾기  (0) 2020.05.15
[Level 1] 모의고사  (0) 2020.05.15

문제 : https://programmers.co.kr/learn/courses/30/lessons/42839

 

코딩테스트 연습 - 소수 찾기

한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 �

programmers.co.kr

에라토스테네스의 체 : https://ko.wikipedia.org/wiki/%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98_%EC%B2%B4

 

에라토스테네스의 체 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 둘러보기로 가기 검색하러 가기 수학에서 에라토스테네스의 체는 소수(소수)를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다. 알고리즘[��

ko.wikipedia.org

▶ 코드

# 에라토스테네스의 체 : N미만의 소수 찾아서 리스트로 반환 
def prime_list(n):
    # 에라토스테네스의 체 초기화: n개 요소에 True 설정(소수로 간주)
    sieve = [True] * n

    # n의 최대 약수가 sqrt(n) 이하이므로 i=sqrt(n)까지 검사
    m = int(n ** 0.5)
    for i in range(2, m + 1):
        if sieve[i] == True:           # i가 소수인 경우
            for j in range(i+i, n, i): # i이후 i의 배수들을 False 판정
                sieve[j] = False

    # 소수 목록 산출
    #print([i for i in range(2, n) if sieve[i] == True])
    return [i for i in range(2, n) if sieve[i] == True]

# numbers에 숫자 하나만 들어있을 경우, 그 숫자가 소수인지 판별 
def isPrime(n):
    c = 0
    for i in range(2, n+1):
        if n%i == 0:
            c += 1
    if c == 1:
        return True
    else:
        return False

def solution(numbers):
    if len(numbers) == 1:
        if isPrime(int(numbers)):
            #print(1)
            #print()
            return 1
        else:
            #print(0)
            #print()
            return 0
    
    t = []
    for a in numbers:
        t.append(int(a))
    t.sort(reverse=True)
    #print('t=', t)
    st = ''
    for a in t:
        st += str(a)
    st = int(st)
    #print('st =', st)
    lst = prime_list(st+1) # st+1 미만의 소수 찾아서 리스트로 반환  

    # 필터링 (각 소수 중, numbers에 없는 숫자 포함된것들을 필터링)
    temp = []
    for a in lst:
        flag = 0
        a = str(a)
        for b in a:
            if int(b) not in t:
                flag = 1
                break
        if flag == 0:
            temp.append(a)
    #print(temp)
    #print(len(temp))
    #print()

    # 필터링 (각 소수를 numbers와 자릿수마다 '해당 숫자' 개수 비교해 필터링)
    res = []
    for a in temp:
        flag = 0
        a = str(a)
        for b in a:
            if a.count(b) > t.count(int(b)):
                flag = 1
                break
        if flag == 0:
            res.append(a)
        
    #print(res)
    #print(len(res))
    #print()      
    
    return len(res)

#solution("013")
#solution("3")
#solution("4")
#solution("007")
#solution("070")
#solution("29")
#solution("17")
#solution("011")
#solution("1234")
#solution("7843")
#solution("999")

'[프로그래머스] 코테 고득점 Kit > 완전탐색' 카테고리의 다른 글

[Level 2] 카펫  (0) 2020.05.15
[Level 1] 모의고사  (0) 2020.05.15

문제 : https://programmers.co.kr/learn/courses/30/lessons/42840

 

코딩테스트 연습 - 모의고사

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는 ��

programmers.co.kr

▶ 코드

def solution(answers):
    # 1번 사람 : 1/2/3/4/5         -> cycle: 5개
    # 2번 사람 : 21/23/24/25       -> cycle: 8개
    # 3번 사람 : 33/11/22/44/55    -> cycle: 10개
    
    p1 = [1,2,3,4,5]
    p2 = [2,1,2,3,2,4,2,5]
    p3 = [3,3,1,1,2,2,4,4,5,5]

    c1 = 0
    c2 = 0
    c3 = 0

    # 길이가 다른 두 배열의 각 원소 비교 (answers는 가변 길이)(p1,p2,p3 는 불변 길이)
    for i in range(len(answers)):
        if p1[i%len(p1)] == answers[i]:
            c1 += 1
        if p2[i%len(p2)] == answers[i]:
            c2 += 1
        if p3[i%len(p3)] == answers[i]:
            c3 += 1
    #print(c1,c2,c3)

    max_value = max(c1,c2,c3)
    res = []

    if c1 >= max_value:
        res.append(1)
    if c2 >= max_value:
        res.append(2)
    if c3 >= max_value:
        res.append(3)

    res.sort()
    return res

    
#solution([1,2,3,4,5])
#solution([1,3,2,4,2])

 

▶ 매개변수로 들어오는 answers의 길이만큼 p1,p2,p3 배열 만들어주면 시간초과 

길이가 다른 두 배열의 각 원소 비교하는 방법 으로 풀이해야됨 

'[프로그래머스] 코테 고득점 Kit > 완전탐색' 카테고리의 다른 글

[Level 2] 카펫  (0) 2020.05.15
[Level 2] 소수 찾기  (0) 2020.05.15