본문 바로가기
스터디/Python

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

by SeO.V 2022. 12. 8.

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

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)

해설

더보기
array.count(x)
배열array에서 x의 갯수를 반환.

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

 


 

이틀 치 끝.