프로그래머스 코딩테스트 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일치 끝.
'스터디 > Python' 카테고리의 다른 글
[CodingTest][2022-12-23]프로그래머스 코딩테스트 Lv.0 문제들 (0) | 2022.12.23 |
---|---|
[CodingTest][2022-12-21~22]프로그래머스 코딩테스트 Lv.0 문제들 (1) | 2022.12.22 |
[CodingTest][2022-12-17~24]프로그래머스 코딩테스트 입문 Part.2 (1) | 2022.12.19 |
[CodingTest][2022-12-17~24]프로그래머스 코딩테스트 입문 Part.1 (0) | 2022.12.16 |
[CodingTest][2022-12-09~12]프로그래머스 코딩테스트 입문 문제들 (2) | 2022.12.16 |