본문 바로가기
스터디/Python

[CodingTest][2022-12-09~12]프로그래머스 코딩테스트 입문 문제들

by SeO.V 2022. 12. 16.

프로그래머스 코딩테스트 입문

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))))

해설

더보기
list(range(15)) 를 하게 되면 15를 제외한 0부터의 수를 list로 감싼 다음에 lambda로 조건을 넣고 filter를 건 다음에 list로 만들어서 반환함. 이전의 짝수 홀수 개수 구하는 문제에서 응용.

점수 : 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)

 


 

이틀 치 끝.