프로그래머스 코딩테스트 입문
2022-12-07 ~ 2022-12-08 까지 최소 6문제.
푼 문제 : 양꼬치, 배열의 평균값, 짝수의 합, 중복된 숫자 개수, 머쓱이보다 키 큰 사람, 피자 나눠 먹기 (1), 배열 뒤집기
양꼬치
link : https://school.programmers.co.kr/learn/courses/30/lessons/120830
문제 설명
머쓱이네 양꼬치 가게는 10인분을 먹으면 음료수 하나를 서비스로 줍니다. 양꼬치는 1인분에 12,000원, 음료수는 2,000원입니다. 정수 n과 k가 매개변수로 주어졌을 때, 양꼬치 n인분과 음료수 k개를 먹었다면 총얼마를 지불해야 하는지 return 하도록 solution 함수를 완성해보세요.
제한사항
- 0 < n < 1,000
- n / 10 ≤ k < 1,000
- 서비스로 받은 음료수는 모두 마십니다.
입출력 예
n | k | result |
10 | 3 | 124,000 |
64 | 6 | 768,000 |
코드 제출 :
# 제출
def solution(n, k):
service = (k - (n // 10))
answer = 0
if n < 10:
answer = (n * 12000) + (k * 2000)
elif n >= 10 and n % 10 >= 0:
answer = (n * 12000) + (service * 2000)
return answer
해설
10 미만일 때는 그냥 서비스 없이 음료수 마신 이력으로 하며, k는 0 이상일 수 밖에 없음 확인하고 풀었다.
그러다가 다른 사람들 풀이 보니까 max(0, k-service) 이 부분에 흥미를 느껴서 확인해보다가 (k-service)든 max(0, k-service)든 테스트는 통과하길래 뭐지 고민하다가 k가 0일 수 없음 확인했으나 혹시 모를 부분으로 방어로서 max 하는 부분은 동의.
# 허점?
def solution(n, k):
service = n // 10
drink = max(0, k-service) # (k-service)
return (n * 12000) + (drink * 2000)
# (k-service)여도 테스트는 통과하길래 고민해보니 n / 10 ≤ k < 1,000 라는 전제 조건과 "서비스로 받은 음료수는 모두 마십니다." 라는 전제 조건이 있기에 k는 0 이 될 수 없음.
그러다가 문제의 그대로 서비스로 받은 음료는 마신다는 부분까지 해서 단순하게
12000 * n + 2000 * k - 2000 * (n//10) 해봤는데 얘도 통과 하는 것 확인.
# 문제 그대로만 할 때까지도 테스트 통과함 확인.
def solution(n, k):
return 12000 * n + 2000 * k - 2000 * (n//10)
전부 확인.
점수 : 1027 (+2)
배열의 평균값
link : https://school.programmers.co.kr/learn/courses/30/lessons/120817
문제 설명
정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소의 평균값을 return하도록 solution 함수를 완성해주세요.
제한사항
- 0 ≤ numbers의 원소 ≤ 1,000
- 1 ≤ numbers의 길이 ≤ 100
- 정답의 소수 부분이 .0 또는 .5인 경우만 입력으로 주어집니다.
입출력 예
numbers | result |
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] | 5.5 |
[89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99] | 94.0 |
코드 제출 :
def solution(numbers):
return round(sum(numbers) / len(numbers), 2)
해설
ref : https://docs.python.org/3/library/functions.html#round
round(number, ndigits=None)
문제에서 "정답의 소수 부분이 .0 또는 .5인 경우만 입력으로 주어집니다." 라고 했으니 round
반올림 함수로서 round(결과값, 2) 로서 한정지어서 반올림 시켰음.
문서에서도 말하듯이 기본적으로 round 메서드는 n자리를 뺀 거듭제곱에 가장 가까운 10배로 반올림이 된다고 했으며, 실수인 float 에서 round(2.675, 2) 일 때는 2.68이 아니라 2.67로 반환이 된다고 함. 버그가 아니라 파이썬의 반올림은 반올림 하려는 수가 올림, 내림했을 때 동일하게 차이가 나는 경우에는 짝수 값으로 반올림하는 셈이다.
예를 들어 0.5 는 0에도 0.5가 차이나고 1에도 0.5가 차이가 나는 상황일 때 파이썬의 round 함수는 똑같이 가깝다면 짝수를 반환하게 설계되어있기 때문에 홀수인 1이 아니라 0 을 반환하는 것인 셈.
설명 잘 된 곳 : https://blockdmask.tistory.com/418
점수 : 1028 (+1)
짝수의 합
link : https://school.programmers.co.kr/learn/courses/30/lessons/120831
문제 설명
정수 n이 주어질 때, n이하의 짝수를 모두 더한 값을 return 하도록 solution 함수를 작성해주세요.
제한사항
- 0 < n ≤ 1000
입출력 예
n | result |
10 | 30 |
4 | 6 |
코드 제출 :
# 제출
def solution(n):
if n == 2:
return n
if n >=3:
return sum(range(2, n, 2)) + (0 if n == 3 else n if n % 2 == 0 else 0)
else:
return 0
해설
여러번 시도함.
처음에는 아래처럼
# 첫번째 - 실패 (6번)
def solution(n):
answer = n if n % 2 == 0 else n-1
for i in range(2,n,2):
answer += i
return answer
# 실패
solution(3)
# 3일 경우 틀림.
하게되면 3일 경우 틀려서 조건식을 추가하고 for 문 대신에 sum과 range를 하나로 합침.
# 두번째 - 실패
def solution(n):
if n == 2:
return n
if n >=3:
return sum(range(2, n, 2)) + n
else:
return 0
solution(5) # 11 - 실패
# solution(3) # 5 - 실패
여기서도 틀렸던 것이 n 에 대한 조건식을 안 걸어서(.. 그래서 조건 추가해서 하니 성공.
그런데 다른 사람 풀이에서 패착 발견.
def solution(n):
return sum([i for i in range(2, n + 1, 2)])
list로 짝수만 뽑고(자기 자신 포함) 그걸 더하면 되는 거였어..
점수 : 1030 (+2)
중복된 숫자 개수
link : https://school.programmers.co.kr/learn/courses/30/lessons/120583
문제 설명
정수가 담긴 배열 array와 정수 n이 매개변수로 주어질 때, array에 n이 몇 개 있는 지를 return 하도록 solution 함수를 완성해보세요.
제한사항
- 1 ≤ array의 길이 ≤ 100
- 0 ≤ array의 원소 ≤ 1,000
- 0 ≤ n ≤ 1,000
입출력 예
array | n | result |
[1, 1, 2, 3, 4, 5] | 1 | 2 |
[0, 2, 3, 4] | 1 | 0 |
코드 제출 :
def solution(array, n):
return array.count(n)
해설
점수 : 1031 (+1)
머쓱이보다 키 큰 사람
link : https://school.programmers.co.kr/learn/courses/30/lessons/120585
문제 설명
머쓱이는 학교에서 키 순으로 줄을 설 때 몇 번째로 서야 하는지 궁금해졌습니다. 머쓱이네 반 친구들의 키가 담긴 정수 배열 array와 머쓱이의 키 height가 매개변수로 주어질 때, 머쓱이보다 키 큰 사람 수를 return 하도록 solution 함수를 완성해보세요.
제한사항
- 1 ≤ array의 길이 ≤ 100
- 1 ≤ height ≤ 200
- 1 ≤ array의 원소 ≤ 200
입출력 예
array | height | result |
[149, 180, 192, 170] | 167 | 3 |
[180, 120, 140] | 190 | 0 |
코드 제출 :
def solution(array, height):
answer = [max(i,height) for i in array]
return len(answer) - answer.count(height)
해설
풀긴 했는데..
뭔가 좀 아쉬워서 다른 사람 풀이 보니까 len([i for i in array if i > height])
len([i for i in array if i > height])
이쪽이 더 깔끔한 느낌.
점수 : 1033 (+2)
피자 나눠 먹기 (1)
link : https://school.programmers.co.kr/learn/courses/30/lessons/120814
문제 설명
머쓱이네 피자가게는 피자를 일곱 조각으로 잘라 줍니다. 피자를 나눠먹을 사람의 수 n이 주어질 때, 모든 사람이 피자를 한 조각 이상 먹기 위해 필요한 피자의 수를 return 하는 solution 함수를 완성해보세요.
제한사항
- 1 ≤ n ≤ 100
입출력 예
n | result |
7 | 1 |
1 | 1 |
15 | 3 |
코드 제출 :
def solution(n):
return (n//7) + (1 if n % 7 != 0 else 0)
해설
7의 배수를 만족 시킨 다음에 7의 배수를 초과하는 경우에 조건 걸어서 +1을 함.
그리고 나서,
(n-1) // 7 + 1
라는 방식을 봤는데, 이거로 좀 고민해 봄.
n // 7 이라는 기본 전제로서 7명당 1판 이라는 걸 7의 배수적인 건 만족하긴 하지만, 그 이상에 대해서는 추가 필요
((n - 1) // 7) + 1로 n-1 이라는 7의 배수는 만족하지 못하게 설정 후 7의 배수 미만이라면 거기에 원래의 7의 배수적인 면으로 +1을 그게 아니라 7의 배수에서 초과값이라면 7의 배수의 나머지들도 먹을 1판을 추가해주는 방식.
이것도 머리 잘 쓴 것 같다.
점수 : 1036 (+3)
짝수 홀수 개수
link : https://school.programmers.co.kr/learn/courses/30/lessons/120824
문제 설명
정수가 담긴 리스트 num_list가 주어질 때, num_list의 원소 중 짝수와 홀수의 개수를 담은 배열을 return 하도록 solution 함수를 완성해보세요.
제한사항
- 1 ≤ num_list의 길이 ≤ 100
- 0 ≤ num_list의 원소 ≤ 1,000
입출력 예
num_list | result |
[1, 2, 3, 4, 5] | [2, 3] |
[1, 3, 5, 7] | [0, 4] |
코드 제출 :
def solution(num_list):
even = list(filter(lambda x: x % 2 == 0, num_list))
odd = list(filter(lambda x: x % 2 != 0, num_list))
return [len(even), len(odd)]
해설
ref : https://docs.python.org/3/library/functions.html#filter
ref : https://docs.python.org/3/reference/expressions.html#lambda
filter(function, iterable) 라는 걸 기억하고 있어서 그걸 쓰고 싶어서 이거로 파고 들음.
처음에는 삼항연산자로 하려고 했는데 그러려면 else 가 있어야 하고 else로 남은 걸 다른 것으로 활용하려니 너무 복잡해지는 느낌이라서 깔끔하게 나눔.
수식적으로 더 줄일 수 있을 거 같긴 한데 예전에 주훈님이 알려주신 부분 ::= 이건 아직 익숙하지 못해서 못 씀.
간략화:
def solution(num_list):
even = list(filter(lambda x: x % 2 == 0, num_list))
return [len(even), len(num_list) - len(even)]
다른 사람 풀이도 봤는데 머리 잘 쓴다 싶던 거,
def solution(num_list):
answer = [0,0]
for n in num_list:
answer[n%2]+=1
return answer
이건 처음에 이해 못했다가, 짝수면 answer에서 0번째에 값에 +=1 아니면 1이 나올테니 1번째에 +=1 을 하는 방식인 걸 이해함.
이것도 머리 잘 썼다 싶다.
점수 : 1037 (+1)
배열 뒤집기
link : https://school.programmers.co.kr/learn/courses/30/lessons/120821
문제 설명
정수가 들어 있는 배열 num_list가 매개변수로 주어집니다. num_list의 원소의 순서를 거꾸로 뒤집은 배열을 return하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ num_list의 길이 ≤ 1,000
- 0 ≤ num_list의 원소 ≤ 1,000
입출력 예
num_list | result |
[1, 2, 3, 4, 5] | [5, 4, 3, 2, 1] |
[1, 1, 1, 1, 1, 2] | [2, 1, 1, 1, 1, 1] |
[1, 0, 1, 1, 1, 3, 5] | [5, 3, 1, 1, 1, 0, 1] |
코드 제출 :
def solution(num_list):
return list(reversed(num_list))
해설
ref : https://docs.python.org/3/library/functions.html#reversed
기억하던 게 있어서 그대로 함. 다만, 맞나 체크 겸사 reversed(num_list)해보니까 이렇게 할 경우, TypeError: Object of type list_reverse iterator is not JSON serializable라고 타입 에러 남. 그래서 type()으로 찍어보니까 <class 'list_reverse iterator'> 참조는 : https://stackoverflow.com/questions/40165800/whats-the-difference-between-a-reversed-tuple-and-a-reversed-list 여기.
점수 : 1038 (+1)
이틀 치 끝.
'스터디 > Python' 카테고리의 다른 글
[CodingTest][2022-12-17~24]프로그래머스 코딩테스트 입문 Part.1 (0) | 2022.12.16 |
---|---|
[CodingTest][2022-12-09~12]프로그래머스 코딩테스트 입문 문제들 (2) | 2022.12.16 |
[CodingTest][2022-12-05]프로그래머스 스킬 테스트 Level 1 (0) | 2022.12.07 |
[CodingTest][2022-12-06]프로그래머스 코딩테스트 입문 문제들 (0) | 2022.12.06 |
[CodingTest][2022-12-05]프로그래머스 스킬 테스트 Level 1 (0) | 2022.12.06 |