728x90

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

출처 : 프로그래머스

 

코딩테스트 연습 - 두 정수 사이의 합

두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요. 예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다. 제한 조건 a와 b가 같은 경우

programmers.co.kr


풀이 1

def solution(a, b):
    answer = 0
    if a<=b:
        answer = sum(range(a,b+1))
    else:
        answer = sum(range(b,a+1))
    return answer

풀이 2

def solution(a, b):
    answer = (abs(a-b)+1)*(a+b)//2
    return answer

 

수열에서 합 공식을 사용하면 된다.

n(a+l)//2 -> n 은 항 개수, a는 첫 항, l은 마지막 항

728x90

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

출처 : 프로그래머스

 

코딩테스트 연습 - 폰켓몬

당신은 폰켓몬을 잡기 위한 오랜 여행 끝에, 홍 박사님의 연구실에 도착했습니다. 홍 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다.

programmers.co.kr


def solution(nums):
    answer = 0
    n = len(nums)//2
    set_n = len(list(set(nums)))

    if n > set_n:
        answer = set_n
    else:
        answer = n
    return answer

풀이

nums//2 가 set(nums)의 길이보다 크면 set(nums)

작으면 nums//2가 되어야한다.

이는 주어진 테스트케이스를 손코딩해보면 알 수 있다.

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

문제

APC에 온 것을 환영한다. 만약 여러분이 학교에서 자료구조를 수강했다면 해시 함수에 대해 배웠을 것이다. 해시 함수란 임의의 길이의 입력을 받아서 고정된 길이의 출력을 내보내는 함수로 정의한다. 해시 함수는 무궁무진한 응용 분야를 갖는데, 대표적으로 자료의 저장과 탐색에 쓰인다.

이 문제에서는 여러분이 앞으로 유용하게 쓸 수 있는 해시 함수를 하나 가르쳐주고자 한다. 먼저, 편의상 입력으로 들어오는 문자열에는 영문 소문자(a, b, ..., z)로만 구성되어있다고 가정하자. 영어에는 총 26개의 알파벳이 존재하므로 a에는 1, b에는 2, c에는 3, ..., z에는 26으로 고유한 번호를 부여할 수 있다. 결과적으로 우리는 하나의 문자열을 수열로 변환할 수 있다. 예를 들어서 문자열 "abba"은 수열 1, 2, 2, 1로 나타낼 수 있다.

해시 값을 계산하기 위해서 우리는 문자열 혹은 수열을 하나의 정수로 치환하려고 한다. 간단하게는 수열의 값을 모두 더할 수도 있다. 해시 함수의 정의에서 유한한 범위의 출력을 가져야 한다고 했으니까 적당히 큰 수 M으로 나눠주자. 짜잔! 해시 함수가 완성되었다. 이를 수식으로 표현하면 아래와 같다.

 H=∑i=0l−1aimodM

해시 함수의 입력으로 들어올 수 있는 문자열의 종류는 무한하지만 출력 범위는 정해져있다. 다들 비둘기 집의 원리에 대해서는 한 번쯤 들어봤을 것이다. 그 원리에 의하면 서로 다른 문자열이더라도 동일한 해시 값을 가질 수 있다. 이를 해시 충돌이라고 하는데, 좋은 해시 함수는 최대한 충돌이 적게 일어나야 한다. 위에서 정의한 해시 함수는 알파벳의 순서만 바꿔도 충돌이 일어나기 때문에 나쁜 해시 함수이다. 그러니까 조금 더 개선해보자.

어떻게 하면 순서가 달라졌을때 출력값도 달라지게 할 수 있을까? 머리를 굴리면 수열의 각 항마다 고유한 계수를 부여하면 된다는 아이디어를 생각해볼 수 있다. 가장 대표적인 방법은 항의 번호에 해당하는 만큼 특정한 숫자를 거듭제곱해서 곱해준 다음 더하는 것이 있다. 이를 수식으로 표현하면 아래와 같다.

 H=∑i=0l−1airimodM

보통 r과 M은 서로소인 숫자로 정하는 것이 일반적이다. 우리가 직접 정하라고 하면 힘들테니까 r의 값은 26보다 큰 소수인 31로 하고 M의 값은 1234567891(놀랍게도 소수이다!!)로 하자.

이제 여러분이 할 일은 위 식을 통해 주어진 문자열의 해시 값을 계산하는 것이다. 그리고 이 함수는 간단해 보여도 자주 쓰이니까 기억해뒀다가 잘 써먹도록 하자.

입력

첫 줄에는 문자열의 길이 L이 들어온다. 둘째 줄에는 영문 소문자로만 이루어진 문자열이 들어온다.

입력으로 주어지는 문자열은 모두 알파벳 소문자로만 구성되어 있다.

출력

문제에서 주어진 해시함수와 입력으로 주어진 문자열을 사용해 계산한 해시 값을 정수로 출력한다.

Small (50점)

  • 1 ≤ L ≤ 5

Large (50점)

  • 1 ≤ L ≤ 50

풀이 1

import sys
n = int(sys.stdin.readline())
s = sys.stdin.readline()
hashmap = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':6, 'g':7, 'h':8, 'i':9, 'j':10,
           'k':11, 'l':12, 'm':13,'n':14,'o':15,'p':16,'q':17,'r':18,'s':19
              ,'t':20,'u':21,'v':22,'w':23,'x':24,'y':25,'z':26
           }
result = 0
for i in range(n):
    result += hashmap[s[i]] * 31**i
print(result % 1234567891)

풀이 2

import sys
n = int(sys.stdin.readline())
s = sys.stdin.readline()

result = 0
for i in range(n):
    result += (ord(s[i])-96) * 31**i
print(result % 1234567891)

+ Recent posts