프로그래머스 코딩테스트 입문
2022-12-09 ~ 2022-12-12 까지 최소 12문제.
푼 문제 : 양꼬치, 배열의 평균값, 짝수의 합, 중복된 숫자 개수, 머쓱이보다 키 큰 사람, 피자 나눠 먹기 (1), 배열 뒤집기
중앙값 구하기
link : https://school.programmers.co.kr/learn/courses/30/lessons/120811
문제 설명
중앙값은 어떤 주어진 값들을 크기의 순서대로 정렬했을 때 가장 중앙에 위치하는 값을 의미합니다. 예를 들어 1, 2, 7, 10, 11의 중앙값은 7입니다. 정수 배열 array가 매개변수로 주어질 때, 중앙값을 return 하도록 solution 함수를 완성해보세요.
제한사항
- array의 길이는 홀수입니다.
- 0 < array의 길이 < 100
- -1,000 < array의 원소 < 1,000
입출력 예
array | result |
[1, 2, 7, 10, 11] | 7 |
[9, -1, 0] | 0 |
코드 제출 :
# 제출
def solution(array):
return sorted(array)[len(array)//2]
해설
median 중앙값이니까 말 그대로 sorted 로 정렬한 다음에 []의 index 번호를 반으로 나눠서 // floor division 이용함.
점수 : 1041(+3)
최빈값 구하기
link : https://school.programmers.co.kr/learn/courses/30/lessons/120812
문제 설명
최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.
제한사항
- 0 < array의 길이 < 100
- 0 ≤ array의 원소 < 1000
입출력 예
numbers | result |
[1, 2, 3, 3, 3, 4] | 3 |
[1, 1, 2, 2] | -1 |
[1] | 1 |
코드 제출 :
# 첫번째 시도 - 실패
def solution(array):
frequency = [0]*max(array)
# if len(array) == 1:
# return 1
for item in array:
frequency[item-1] += 1
print(f'frequency : {frequency} / max(frequency) : {max(frequency)}')
# print(frequency.count(max(frequency)))
return max(frequency) if frequency.count(max(frequency)) == 1 else -1
# 실행 예시는 다 성공인데 테스트 케이스에서 실패 37.5
# frequency.count(max(frequency)) -> 이게 틀림. 당연함. 그 빈도수가 아닌 value 의 갯수이므로.
# 제출
from collections import Counter
def solution(array):
c = Counter(array)
order = c.most_common()
maximum = order[0][1]
modes = []
# print(f'c : {c} / order : {order} / maximum : {maximum} / modes : {modes}')
for num in order:
print(f'num : {num} / maximum : {maximum}')
if num[1] == maximum:
modes.append(num[0])
# print(f'After for loop - modes : {modes}')
return -1 if len(modes) > 1 else modes[0]
# 그 다음 시도
def solution(array):
frequency = [0]*(max(array)+1)
for item in array:
frequency[item] += 1
return -1 if frequency.count(max(frequency)) != 1 else frequency.index(max(frequency))
# 성공
해설
ref - https://wikidocs.net/84105
ref - https://medium.com/analytics-vidhya/beginners-guide-from-collections-import-counter-d93bcecd190b
처음에는 최빈값을 구하는 방식을 대략적으로 알고 있어서 그걸 쓰고 싶어서 하다가 문제를 제대로 보지 못함. 최빈값이 여러개 일 때만 -1 반환이고 그게 아니면 최빈값의 반환 해야했다. 그 부분 이해를 잘못하다가 그냥 from collections import Counter 를 쓰려고 했고, https://wikidocs.net/84105 와 https://medium.com/analytics-vidhya/beginners-guide-from-collections-import-counter-d93bcecd190b 를 참조해서 해결했더니 다른 사람의 풀이도 비슷한 게 있었고, 첫번째 부분이 아쉬워서 추가적으로 풀어봄.
점수 : 1052(+11)
짝수는 싫어요
link : https://school.programmers.co.kr/learn/courses/30/lessons/120813
문제 설명
정수 n이 매개변수로 주어질 때, n 이하의 홀수가 오름차순으로 담긴 배열을 return하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ n ≤ 100
입출력 예
n | result |
10 | [1, 3, 5, 7, 9] |
15 | [1, 3, 5, 7, 9, 11, 13, 15] |
코드 제출 :
# 제출
def solution(n):
return list(filter(lambda x: x % 2 != 0, list(range(n+1))))
해설
점수 : 1053(+1)
중복된 숫자 개수
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.2 (1) | 2022.12.19 |
---|---|
[CodingTest][2022-12-17~24]프로그래머스 코딩테스트 입문 Part.1 (0) | 2022.12.16 |
[CodingTest][2022-12-08]프로그래머스 코딩테스트 입문 문제들 (0) | 2022.12.08 |
[CodingTest][2022-12-05]프로그래머스 스킬 테스트 Level 1 (0) | 2022.12.07 |
[CodingTest][2022-12-06]프로그래머스 코딩테스트 입문 문제들 (0) | 2022.12.06 |