로또의 최고 순위와 최저 순위 (Python)

**문제**

`로또 6/45`(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. [1](https://school.programmers.co.kr/learn/courses/30/lessons/77484#fn1)

순위당첨 내용

1 6개 번호가 모두 일치
2 5개 번호가 일치
3 4개 번호가 일치
4 3개 번호가 일치
5 2개 번호가 일치
6(낙첨) 그 외

로또를 구매한 민우는 당첨 번호 발표일을 학수고대하고 있었습니다. 하지만, 민우의 동생이 로또에 낙서를 하여, 일부 번호를 알아볼 수 없게 되었습니다. 당첨 번호 발표 후, 민우는 자신이 구매했던 로또로 당첨이 가능했던 최고 순위와 최저 순위를 알아보고 싶어 졌습니다. 알아볼 수 없는 번호를 `0`으로 표기하기로 하고, 민우가 구매한 로또 번호 6개가 `44, 1, 0, 0, 31 25`라고 가정해보겠습니다. 당첨 번호 6개가 `31, 10, 45, 1, 6, 19`라면, 당첨 가능한 최고 순위와 최저 순위의 한 예는 아래와 같습니다.

당첨 번호3110451619결과

최고 순위 번호 **31** 0→**10** 44 **1** 0→**6** 25 4개 번호 일치, 3등
최저 순위 번호 **31** 0→11 44 **1** 0→7 25 2개 번호 일치, 5등
  • 순서와 상관없이, 구매한 로또에 당첨 번호와 일치하는 번호가 있으면 맞힌 걸로 인정됩니다.
  • 알아볼 수 없는 두 개의 번호를 각각 10, 6이라고 가정하면 3등에 당첨될 수 있습니다.
    • 3등을 만드는 다른 방법들도 존재합니다. 하지만, 2등 이상으로 만드는 것은 불가능합니다.
  • 알아볼 수 없는 두 개의 번호를 각각 11, 7이라고 가정하면 5등에 당첨될 수 있습니다.
    • 5등을 만드는 다른 방법들도 존재합니다. 하지만, 6등(낙첨)으로 만드는 것은 불가능합니다.

민우가 구매한 로또 번호를 담은 배열 lottos, 당첨 번호를 담은 배열 win_nums가 매개변수로 주어집니다. 이때, 당첨 가능한 최고 순위와 최저 순위를 차례대로 배열에 담아서 return 하도록 solution 함수를 완성해주세요.

def solution(lottos, win_nums):
    
    result = []
    cnt = 0
    unknow = 0
    
    for lotto in lottos:
        if (lotto == 0):
            unknow += 1
        for win_num in win_nums:
            if (lotto == win_num):
                cnt += 1
    
    high = 7 - (unknow + cnt)
    low = 7 - cnt
    
    if high >= 6:
        high = 6
    if low >= 6:
        low = 6
    
    result.append(high)
    result.append(low)
    
    return result

[카카오 인턴] 키패드 누르기 (Python)

**문제**

스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.

이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다. 맨 처음 왼손 엄지손가락은 `*` 키패드에 오른손 엄지손가락은 `#` 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.

  1. 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
  2. 왼쪽 열의 3개의 숫자 `1`, `4`, `7`을 입력할 때는 왼손 엄지손가락을 사용합니다.
  3. 오른쪽 열의 3개의 숫자 `3`, `6`, `9`를 입력할 때는 오른손 엄지손가락을 사용합니다.
  4. 가운데 열의 4개의 숫자 `2`, `5`, `8`, `0`을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다. 4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.

순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.

def solution(numbers, hand):
    
    result = ''
    left_index = '*'
    right_index = '#'
    left = [1,4,7]
    right = [3,6,9]    
    
    
    keypad = { 1:(0,0), 2:(0,1), 3:(0,2),
               4:(1,0), 5:(1,1), 6:(1,2),
               7:(2,0), 8:(2,1), 9:(2,2),
               '*':(3,0), 0:(3,1), '#':(3,2) }
    
    for number in numbers:
        
        if number in left:
            result += 'L'
            left_index = number
            
        elif number in right:
            result += 'R'
            right_index = number
        else:
            current_pos = keypad[number]
            left_pos = keypad[left_index]
            right_pos = keypad[right_index]
            dis_left = abs(current_pos[0] - left_pos[0])  + abs(current_pos[1] - left_pos[1])
            dis_right = abs(current_pos[0] - right_pos[0])  + abs(current_pos[1] - right_pos[1])
            
            if (dis_left < dis_right):
                result += 'L'
                left_index = number
            elif (dis_left > dis_right):
                result += 'R'
                right_index = number
            else:
                if (hand == 'left'):
                    result += 'L'
                    left_index = number
                else:
                    result += 'R'
                    right_index = number
    
    return result

음양 더하기 (Python)

**문제**

어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.

def solution(absolutes, signs):
    
    result = []
    
    l = len(signs)
    
    for i in range(l):
        if signs[i]:
            result.append(absolutes[i])
        else:
            result.append((-1)*absolutes[i])
    
    return sum(result)

소수 만들기 (Python)

**문제**

주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.

import itertools
import math

def prime_check(num):
    
    cnt = 0
    
    if num == 1 or num == 0:
        return False
    
    if num == 2:
        return True
    
    for i in range(2, int(math.sqrt(num) + 1), 1):
        if (num%i)==0:
            return False
    
    return True
            

def solution(nums):
    
    cnt = 0

    datas = itertools.combinations(nums,3)
    
    for data in datas:
        
        if prime_check(sum(data)):
            cnt+=1
    

    return cnt

완주하지 못한 선수 (Python)

**문제**

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

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

import collections

def solution(participant, completion):
    
    result = collections.Counter(participant) - collections.Counter(completion)
    

    return list(result)[0]

모의고사 (Python)

**문제**

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

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ... 2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ... 3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

def solution(answers):
    
    giveup1 = [1, 2, 3, 4, 5]
    giveup2 = [2, 1, 2, 3, 2, 4, 2, 5]
    giveup3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    
    cnt = [0,0,0]
    temp = []
    result = []
    
    for i in range(len(answers)):
        if (answers[i] == giveup1[(i%5)]):
            cnt[0] += 1
        if (answers[i] == giveup2[(i%8)]):
            cnt[1] += 1
        if (answers[i] == giveup3[(i%10)]):
            cnt[2] += 1
    
    for i in range(0,len(cnt)):
        if (cnt[i]==max(cnt)):
            result.append(i+1)
            
    return result

약수의 개수와 덧셈 (Python)

**문제**

두 정수 `left``right`가 매개변수로 주어집니다. `left`부터 `right`까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.

def solution(left, right):
    
    result = []
    
    for i in range(left,(right+1)):
        cnt = 0
        
        for j in range(1,(i+1)):
            if (i%j==0):
                cnt += 1
            
        if (cnt%2==0):
            result.append(i)
        else:
            result.append((-1)*i)
    
    return sum(result)

예산 (Python)

**문제**

S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 없습니다. 그래서 최대한 많은 부서의 물품을 구매해 줄 수 있도록 하려고 합니다.

물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 합니다. 예를 들어 1,000원을 신청한 부서에는 정확히 1,000원을 지원해야 하며, 1,000원보다 적은 금액을 지원해 줄 수는 없습니다.

부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을 지원할 수 있는지 return 하도록 solution 함수를 완성해주세요.

def solution(d, budget):
    
    d.sort()
    cnt = 0
    
    for i in range(len(d)):
        budget -= d[i]
        
        if budget>=0:
            cnt += 1
        else:
            break

    return cnt

2016년 (Python)

**문제**

2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까지 각각 `SUN,MON,TUE,WED,THU,FRI,SAT`

입니다. 예를 들어 a=5, b=24라면 5월 24일은 화요일이므로 문자열 "TUE"를 반환하세요.

def solution(a, b):
    
    day = ['THU', 'FRI', 'SAT', 'SUN', 'MON', 'TUE', 'WED']
    month = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    
    tot = 0
    
    for i in range(a-1):
        tot += month[i]
    
    tot += b
    cnt = tot%7
    
    return day[cnt]

나머지가 1이 되는 수 찾기 (Python)

**문제**

자연수 `n`이 매개변수로 주어집니다. `n``x`로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 `x`를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다.

def solution(n):
    
    for i in range(2, n):
        if (n%i == 1):
            return i

'코딩 테스트 > 구현' 카테고리의 다른 글

프로그래머스 Lv1 - (5)  (0) 2022.08.16
프로그래머스 Lv1 - (3)  (0) 2022.08.10
프로그래머스 Lv1 - (2)  (0) 2022.08.10
프로그래머스 Lv1 - (1)  (0) 2022.08.08

+ Recent posts