본문 바로가기
스터디/Python

[CodingTest][2022-12-20]프로그래머스 코딩테스트 Lv.0 문제들

by SeO.V 2022. 12. 20.

프로그래머스 코딩테스트 Lv.0 문제들

2022-12-20 

Lv 0 을 빠르게 해치우고 싶어서 추가적으로 계속 풀기.

푼 문제 : 진료 순서 정하기, 모스부호 (1), 구슬을 나누는 경우의 수 - 3문제

 

진료 순서 정하기

link : https://school.programmers.co.kr/learn/courses/30/lessons/120835

 

문제 설명

외과의사 머쓱이는 응급실에 온 환자의 응급도를 기준으로 진료 순서를 정하려고 합니다. 정수 배열 emergency가 매개변수로 주어질 때 응급도가 높은 순서대로 진료 순서를 정한 배열을 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • 중복된 원소는 없습니다.
  • 1 ≤ emergency의 길이 ≤ 10
  • 1 ≤ emergency의 원소 ≤ 100

입출력 예

emergency  result
[3, 76, 24] [3, 1, 2]
[1, 2, 3, 4, 5, 6, 7] [7, 6, 5, 4, 3, 2, 1]
[30, 10, 23, 6, 100] [2, 4, 3, 5, 1]

 

코드 제출 :

def solution(emergency):
    tmp = sorted(emergency, reverse=True)
    return [tmp.index(e)+1 for e in emergency]

 

해설

더보기

처음에는 dict()으로 해보려다가 쓸데없이 복잡해져서 그냥 sorted(reverse = True)를 이용한 부분에 index 이용.

 

다른 사람 풀이 중에서

solution = lambda emergency: [(dic:={val:idx for idx,val in enumerate(sorted(emergency[:],reverse=True),start=1)})[i] for i in emergency]

이게 제일 충격..

일반적으로 주어지는 코드가

def solution(emergency):
	answer = []
    return answer

위와 같다고 할 때, 

예를 들어서 emergency = [10, 21, 3, 4, 533, 623, 17] 라고 할 때,
= [] # 안에 감싸면서 return을 하고
lambda emergency: # 로서 받은 인자 emergency를 람다로 넣는데
# 람다 안에도 [] 안에 
(dic:={val:idx for idx,val in enumerate(sorted(emergency[:],reverse=True),start=1)})[i] for i in emergency
# enumerate(sorted(emergency[:],reverse=True),start=1)로 문제에서 요구하는 역순(=응급도가 높은 순서대로)으로
# 각기 index와 value를 역순으로 구하면서 그걸 
# dic:={val:idx for ...} # dict으로 처리한 다음에
# 그러면 결과가 {100: 1, 30: 2, 23: 3, 10: 4, 6: 5} 이렇게 들어오는 걸, 
# [i] for i in emergency 로서 의 순으로 들어가는 건가?

정확하게 이해하진 않았지만 순서 부분 좀 더 이해 필요.

연습 더 해야겠다.

점수 : 1117(+1)


모스부호 (1) 

link : https://school.programmers.co.kr/learn/courses/30/lessons/120838

 

문제 설명

머쓱이는 친구에게 모스부호를 이용한 편지를 받았습니다. 그냥은 읽을 수 없어 이를 해독하는 프로그램을 만들려고 합니다. 문자열 letter가 매개변수로 주어질 때, letter를 영어 소문자로 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요.모스부호는 다음과 같습니다.

morse = { 
    '.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f',
    '--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l',
    '--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r',
    '...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x',
    '-.--':'y','--..':'z'
}

제한사항

  • 1 ≤ letter의 길이 ≤ 1,000
  • return값은 소문자입니다.
  • letter의 모스부호는 공백으로 나누어져 있습니다.
  • letter에 공백은 연속으로 두 개 이상 존재하지 않습니다.
  • 해독할 수 없는 편지는 주어지지 않습니다.
  • 편지의 시작과 끝에는 공백이 없습니다.

입출력 예

letter result
".... . .-.. .-.. ---" "hello"
".--. -.-- - .... --- -." "python"

 

 

코드 제출 :

def solution(letter):
    morse = {'.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f', '--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l', '--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r', '...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x', '-.--':'y','--..':'z'}
    return ''.join([morse[s] for s in letter.split()])

 

 

해설

더보기

morse 라는 주어진 dict에 키에 대응되는 값들을 list로 넣고 join으로 문자열 반환.

점수 : 1118(+1)


구슬을 나누는 경우의 수

link : https://school.programmers.co.kr/learn/courses/30/lessons/120840

 

문제 설명

머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다. 머쓱이가 갖고 있는 구슬의 개수 balls와 친구들에게 나누어 줄 구슬 개수 share이 매개변수로 주어질 때, balls개의 구슬 중 share개의 구슬을 고르는 가능한 모든 경우의 수를 return 하는 solution 함수를 완성해주세요.

제한사항

  • 1 ≤ balls ≤ 30
  • 1 ≤ share ≤ 30
  • 구슬을 고르는 순서는 고려하지 않습니다.
  • share ≤ balls

입출력 예

balls  share  result
3 2 3
5 3 10

 

입출력 예 설명

입출력 예 #1

  • 서로 다른 구슬 3개 중 2개를 고르는 경우의 수는 3입니다.

입출력 예 #2

  • 서로 다른 구슬 5개 중 3개를 고르는 경우의 수는 10입니다.

 

Hint

  • 서로 다른 n개 중 m개를 뽑는 경우의 수 공식은 다음과 같습니다.

※ 공지 - 2022년 10월 11일 제한 사항 및 테스트케이스가 수정되었습니다.

 

 

코드 제출 :

# 제출
import math
def solution(balls, share):
    return math.factorial(balls) /(math.factorial((balls-share)) * math.factorial(share))
# 다른 방법
import math
def solution(balls, share):
    ball = math.prod(map(int, range(1,balls+1)))
    shared = math.prod(map(int, range(1,share+1)))
    sub = math.prod(map(int, range(1,(balls-share)+1)))
    return ball / (sub * shared)
# 팩토리얼 재귀함수 쓰기
# 재귀함수 사용
def factorial(n):
    if(n > 1):
        return n * factorial(n - 1)
    else:
        return 1
def solution(balls, share):
    return factorial(balls) / (factorial(balls-share) * factorial(share))
# 팩토리얼 
# for loop 사용
def factorial(n):
    answer = 1
    for num in range(1,n+1):
        answer *= num
    return answer
def solution(balls, share):
    return factorial(balls) / (factorial(balls-share) * factorial(share))

 

 

해설

더보기

우선 문제의 식에서 n! 은 팩토리얼을 의미하고, 1부터 n까지의 자연수를 모두 곱하는 것을 의미한다. 공식이 이미 있어서 import math의 라이브러리를 쓸 때, 2가지 방법이 있다.

1. math.factorial(n)

Return n factorial as an integer. Raises ValueError if n is not integral or is negative.

버전 3.9부터 폐지됨: 정숫값 부동 소수점(5.0과 같은)을 허용하는 것은 폐지되었습니다.

ref : https://docs.python.org/ko/3/library/math.html?highlight=math factorial#math.factorial

 

2. math.prod(numbers) math.prod(iterable, *, start=1) + python 3.8 에 추가됨

입력 이터러블(iterable)에 있는 모든 요소의 곱을 계산합니다. 곱의 기본 start 값은 1입니다.

iterable이 비어 있으면, start 값을 반환합니다. 이 함수는 숫자 값과 함께 사용하기 위한 것으로, 숫자가 아닌 형을 거부 할 수 있습니다.

ref : https://docs.python.org/ko/3/library/math.html?highlight=math prod#math.prod

 

그게 아니라면 팩토리얼을 구현해야 한다

재귀함수로서

# 재귀함수 사용
def factorial(n):
    if(n > 1):
        return n * factorial(n - 1)
    else:
        return 1

위처럼 쓰던가

# for loop 사용
def factorial(n):
    answer = 1
    for num in range(1,n+1):
        answer *= num
    return answer
def solution(balls, share):
    return factorial(balls) / (factorial(balls-share) * factorial(share))

for 반복문을 이용해서 사용하는 거다.

점수 : 1133(+15)


 

 

여기까지 20일치 끝.