728x90

https://programmers.co.kr/learn/courses/30/lessons/42889

 

코딩테스트 연습 - 실패율

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스

programmers.co.kr

def solution(N, stages):
    answer = {}
    cntplayer = len(stages)
    
    # 각 스테이지별 실패율 딕셔너리에 저장
    for i in range(1,N+1):
        if cntplayer != 0:
            answer[i] = stages.count(i) /cntplayer # 실패율
            cntplayer -= stages.count(i)
        else: # 스테이지 도달한 유저 없는 경우 실패율 0
            answer[i] = 0
        
    return sorted(answer,key = lambda x:-answer[x])

풀이

1부터 N까지의 스테이지 도달한 개수를 구하고 그 개수를 계속 제외해서 다음 실패율을 구한다.

구한 실패율을 answer 딕셔너리에 넣고, 

실패율이 큰 순서대로 정렬한다.

728x90

https://programmers.co.kr/learn/courses/30/lessons/42746#

출처 : 프로그래머스

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr

def solution(numbers):
    numbers = list(map(str,numbers)) # string 리스트로 변경
    numbers.sort(key = lambda x:x*3,reverse = True) 
    # print(numbers)
    return str(int(''.join(numbers)))

 

728x90

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

출처 : 프로그래머스

 

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

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

programmers.co.kr


def solution(genres, plays):
    answer = []
    arr = sorted([[genres[i], plays[i], i] for i in range(len(genres))],key = lambda x:(x[0],-x[1], x[2]))

    # 재생횟수
    total_play = {}
    for i in arr:
        if i[0] not in total_play:
            total_play[i[0]] = i[1]
        else:
            total_play[i[0]] += i[1]
    total_play = sorted(total_play.items(), key = lambda x:-x[1]) # 재생횟수가 더 많은 타입부터

    for t in total_play: 
        cnt = 0
        for i in arr:
            if t[0] == i[0]: # 재생횟수 많은 노래 타입과 arr의 타입 같다면 
                cnt += 1
                if cnt > 2: # 한 장르에 앨범 2개만 실어야해서
                    break
                else:
                    answer.append(i[2]) # 노래의 고유번호 삽입
    return answer

풀이1

def solution(genres, plays):
    answer = []
    dict1 = {}
    dict2 = {}
    for i, (g,p) in enumerate(zip(genres,plays)):
        if g not in dict1:
            dict1[g] = [(i,p)]
        else:
            dict1[g].append((i,p))
        if g not in dict2:
            dict2[g] = p
        else:
            dict2[g] += p

    for (k,v) in sorted(dict2.items(), key = lambda x:-x[1]): # 많이 재생한 노래 타입 먼저
        for (i,p) in sorted(dict1[k], key = lambda x:-x[1])[:2]: # 많이 재생한 노래 2개
            answer.append(i)

    return answer

풀이2

 

1. 속한 노래 많이 재생된 장르

   2. 장르 내 가자아 많이 재생된 노래

        3. 같으면 고유 번호 낮은 노래 먼저

 

우선순위를 생각하자.

728x90

https://programmers.co.kr/learn/courses/30/lessons/42578

출처 : 프로그래머스

 

코딩테스트 연습 - 위장

 

programmers.co.kr

def solution(clothes):
    answer = 1
    clothes_hash = {}
    for c_name, c_type in clothes:
        if c_type not in clothes_hash: # 처음 해쉬에 넣는 옷 종류면
            clothes_hash[c_type] = 2 # 안 입는 경우 까지 더해서 2
        else:
            clothes_hash[c_type] += 1
    
    for c in clothes_hash.values():
        answer *= c
    return answer-1

풀이

해시와 경우의 수로 풀이했다.

해시에 넣을 때, 타입의 키가 없는 경우에 2를 더해주는 것에 주의하자.

해당 타입을 고르거나 안 고르거나 (안 입거나) 2가지 경우의 수를 넣어주는 것이다.

 

최종 경우의 수는 모든 values()의 곱에 -1을 해줘야 한다.

하나도 안 입는 경우는 없기 때문에 -1을 해준다.

경우의 수로 옷 입히기 생각하면 된다.

728x90

출처 : 프로그래머스

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

 

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

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

programmers.co.kr

def solution(phone_book):
    answer = True
    # 전화번호부 해시 생성
    hashmap = {}
    for phone_num in phone_book:
        hashmap[phone_num] = 1

    # 접두사 찾기
    for phone_num in phone_book:
        tmp = ''
        for num in phone_num:
            tmp += num
            # 하나씩 입력한 전화번호의 번호가 해쉬맵에 있고 자기 자신 번호가 아닐 때
            if tmp in hashmap and tmp != phone_num:
                answer = False
    return answer

풀이 1

해시 문제라 해시로 풀이했다.

전화번호를 해시 맵에 입력해주고,

한 사람의 전화번호의 번호를 tmp에 저장하고 hashmap에 있는 전화번호와 비교하며 자기 자신인 경우를 제외한다.

def solution(phone_book):
    answer = True
    pbook = sorted(phone_book)

    for a,b in zip(pbook, pbook[1:]):
        if b.startswith(a):
            return False
    return answer

풀이 2

전화번호가 문자열이니 정렬하고 두 번째 전화번호부터 비교한다.

startswith()를 사용했다.

 

728x90

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

 

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

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

programmers.co.kr

출처 : 프로그래머스

def solution(participant, completion):
    # 정렬
    participant.sort()
    completion.sort()

    for i,j in zip(participant, completion):
        if i!=j:
            return i
    return participant[-1]
728x90

https://programmers.co.kr/learn/courses/30/lessons/64061

 

코딩테스트 연습 - 크레인 인형뽑기 게임

[[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]] [1,5,3,5,1,2,1,4] 4

programmers.co.kr

출처 : 프로그래머스

 


def solution(board, moves):
    answer = 0
    basket = [] # 바구니 스택
    for move in moves:
        for i in board:
            if i[move-1] != 0: # 인형이 있다면
                basket.append(i[move - 1])  # 바구니에 넣는다.
                i[move - 1] = 0  # 인형 빼고 빈칸으로 만들어준다.
                # print("before",basket)
                if len(basket) > 1:
                    if basket[-1] == basket[-2]: # 바구니 위에 같은 인형 2개 연속하면
                        answer += 2
                        basket.pop() # 연속한 인형 두개 pop()
                        basket.pop()
                break
    return answer

풀이

moves 배열에 있는 (수-1) 번째 열의 board 값 비교한다.

그곳에 인형이 있다면 그 인형을 바구니에 넣어준다.

바구니에는 연속해서 2개 같은 인형이 있으면 둘 다 삭제해주고 answer+=2 해준다.

+ Recent posts