본문 바로가기
스터디/Python

[CodingTest][2022-12-17~24]프로그래머스 코딩테스트 입문 Part.1

by SeO.V 2022. 12. 16.

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

2022-12-17 ~ 2022-12-24 까지 최소 30문제 풀기. 밀린 것과 정리 안된 거 정리

푼 문제 :  피자 나눠 먹기 (2), 피자 나눠 먹기 (3), 옷가게 할인 받기, 아이스 아메리카노, 문자열 뒤집기, 배열 자르기, 삼각형의 완성조건 (1), 배열 원소의 길이, 최댓값 만들기(1), 특정 문자 제거하기, 편지, 점의 위치 구하기, 문자 반복 출력하기, 순서쌍의 개수, 문자열안에 문자열, 제곱수 판별하기 -> 우선 여기까지 16개 part1 

피자 나눠 먹기 (2)

link :https://school.programmers.co.kr/learn/courses/30/lessons/120815

 

문제 설명

머쓱이네 피자가게는 피자를 여섯 조각으로 잘라 줍니다. 피자를 나눠먹을 사람의 수 n이 매개변수로 주어질 때, n명이 주문한 피자를 남기지 않고 모두 같은 수의 피자 조각을 먹어야 한다면 최소 몇 판을 시켜야 하는지를 return 하도록 solution 함수를 완성해보세요.

 

제한사항

  • 1 ≤ n ≤ 100

입출력 예

 

n result
6 1
10 5
4 2

코드 제출 : 

# 제출
import math
def solution(n):
    return ((6 * n) // math.gcd(6, n)) // 6

해설

더보기

최소공배수 (Lowest Common Multiple, LCM) 구하는 문제라고 생각해서 6과 n 곱한 걸 최대공약수로 나누고 피자의 갯수니까 6으로 나눔.

점수 : 1057 (+4)

 

 


피자 나눠 먹기 (3)

link : https://school.programmers.co.kr/learn/courses/30/lessons/120816

 

문제 설명

머쓱이네 피자가게는 피자를 두 조각에서 열 조각까지 원하는 조각 수로 잘라줍니다. 피자 조각 수 slice와 피자를 먹는 사람의 수 n이 매개변수로 주어질 때, n명의 사람이 최소 한 조각 이상 피자를 먹으려면 최소 몇 판의 피자를 시켜야 하는지를 return 하도록 solution 함수를 완성해보세요.

 

제한사항

  • 2 ≤ slice ≤ 10
  • 1 ≤ n ≤ 100

입출력 예

slice n result
7 10 2
4 12 3

코드 제출 : 

# 제출
import math
def solution(slice, n):
    lcm = ((slice * n) // math.gcd(slice, n)) // slice
    return (n // slice)+1 if math.gcd(slice, n) == 1 else lcm

 

해설

더보기

math.gcd(slice, n)) 가 1이면 단순하게 서로소라는 거니까 slice 만큼 나누고 +1 하고 그게 아니면 LCM 최소공배수 적용.

 

점수 : 1059 (+2)

 


옷가게 할인 받기

link : https://school.programmers.co.kr/learn/courses/30/lessons/120818

 

문제 설명

머쓱이네 옷가게는 10만 원 이상 사면 5%, 30만 원 이상 사면 10%, 50만 원 이상 사면 20%를 할인해줍니다.
구매한 옷의 가격 price가 주어질 때, 지불해야 할 금액을 return 하도록 solution 함수를 완성해보세요.

 

제한사항

  • 10 ≤ price ≤ 1,000,000
    • price는 10원 단위로(1의 자리가 0) 주어집니다.
  • 소수점 이하를 버린 정수를 return합니다.

입출력 예

price result
150,000 142,500
580,000 464,000

 

코드 제출 : 

# 첫번째 시도 - 실패 : 13,14번
def solution(price):
    if price >= 500000:
        return (price - int(price*0.2))
    if price >= 300000 and price < 500000:
        return (price - int(price*0.1))
    if price >= 100000 and price < 300000:
        return (price - int(price*0.05))
    else:
        return price
# 제출
def solution(price):
    if price >= 500000:
        return int(price*0.8)
    if price >= 300000 and price < 500000:
        return int(price*0.9)
    if price >= 100000 and price < 300000:
        return int(price*0.95)
    if price < 100000:
        return price

해설

더보기
할인이니까 그 할인된 금액을 반환하면 될 걸 그걸 빼서 틀림.

점수 : 1073 (+14)

 


아이스 아메리카노

 

link : https://school.programmers.co.kr/learn/courses/30/lessons/120819

 

문제 설명

머쓱이는 추운 날에도 아이스 아메리카노만 마십니다. 아이스 아메리카노는 한잔에 5,500원입니다. 머쓱이가 가지고 있는 돈 money가 매개변수로 주어질 때, 머쓱이가 최대로 마실 수 있는 아메리카노의 잔 수와 남는 돈을 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.

 

제한사항

  • 0 < money ≤ 1,000,000

입출력 예

money result
5,500 [1, 0]
15,000 [2, 4000]

 

 

코드 제출 : 

def solution(money):
    coffee = 5500
    return [money//coffee,money%coffee]

해설

더보기
문제 그대로. 
리스트 안에 [돈으로 커피값에서 살 수 있는 개수로서 Modulus 몫, 그리고 나머지]

점수 : 1074(+1)

 


문자열 뒤집기

 

link : https://school.programmers.co.kr/learn/courses/30/lessons/120822

 

문제 설명

문자열 my_string이 매개변수로 주어집니다. my_string을 거꾸로 뒤집은 문자열을 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • 1 ≤ my_string의 길이 ≤ 1,000

입출력 예

my_string return
"jaron" "noraj"
"bread" "daerb"

 


코드 제출 : 

def solution(my_string):
    return my_string[::-1]

해설

더보기

문자열 slicing 이용

점수 : 1075(+1)

 


배열 자르기

link : https://school.programmers.co.kr/learn/courses/30/lessons/120833

 

문제 설명

정수 배열 numbers와 정수 num1, num2가 매개변수로 주어질 때, numbers의 num1번 째 인덱스부터 num2번째 인덱스까지 자른 정수 배열을 return 하도록 solution 함수를 완성해보세요.

 

제한사항

  • 2 ≤ numbers의 길이 ≤ 30
  • 0 ≤ numbers의 원소 ≤ 1,000
  • 0 ≤num1 < num2 < numbers의 길이
  •  

입출력 예

numbers num1 num2 result
[1, 2, 3, 4, 5] 1 3 [2, 3, 4]
[1, 3, 5] 1 2 [3, 5]

 

코드 제출 : 

def solution(numbers, num1, num2):
    return numbers[num1:num2+1]

해설

점수 : 1077(+2)

 


삼각형의 완성조건 (1)

link : https://school.programmers.co.kr/learn/courses/30/lessons/120889

 

문제 설명
선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.

  • 가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.

삼각형의 세 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 세 변으로 삼각형을 만들 수 있다면 1, 만들 수 없다면 2를 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • sides의 원소는 자연수입니다.
  • sides의 길이는 3입니다.
  • 1 ≤ sides의 원소 ≤ 1,000

입출력 예

sides result
[1, 2, 3] 2
[3, 6, 2] 2
[199, 72, 222] 1


 

코드 제출 : 

def solution(sides):
    sides = sorted(sides)
    return 2 if sides[0]+sides[1] <= sides[2] else 1

해설

더보기

문제 그대로 sorted(sides) 한 다음에 가장 큰 값인 sides[2]이 두 합보다 크면 만들 수 없으니 2를 아니면 만들수 있으니 1 반환.

점수 : 1079(+2)

 


배열 원소의 길이

link : https://school.programmers.co.kr/learn/courses/30/lessons/120854

 

문제 설명

문자열 배열 strlist가 매개변수로 주어집니다. strlist 각 원소의 길이를 담은 배열을 retrun하도록 solution 함수를 완성해주세요.

 

제한사항

  • 1 ≤ strlist 원소의 길이 ≤ 100
  • strlist는 알파벳 소문자, 대문자, 특수문자로 구성되어 있습니다.

 

입출력 예

strlist  result
["We", "are", "the", "world!"] [2, 3, 3, 6]
["I", "Love", "Programmers."] [1, 4, 12]

 

 

코드 제출 : 

def solution(strlist):
    return [len(str) for str in strlist]

해설

더보기

리스트 컴프리헨션으로 for 문 돌리면서 len으로 길이가 적용되도록 처리

점수 : 1080(+1)

 


최댓값 만들기(1)

link : https://school.programmers.co.kr/learn/courses/30/lessons/120847

 

문제 설명

정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • 0 ≤ numbers의 원소 ≤ 10,000
  • 2 ≤ numbers의 길이 ≤ 100

 

입출력 예

numbers result
[1, 2, 3, 4, 5] 20
[0, 31, 24, 10, 1, 9] 744

 

코드 제출 : 

def solution(numbers):
    numbers = sorted(numbers)
    return numbers[-1]*numbers[-2]

해설

더보기

sorted 로 정렬하고 나서 리스트 인덱스 슬라이싱으로 가장 큰 수 2개를 곱함.

점수 : 1082(+2)

 


특정 문자 제거하기

link : https://school.programmers.co.kr/learn/courses/30/lessons/120826

 

문제 설명

문자열 my_string과 문자 letter이 매개변수로 주어집니다. my_string에서 letter를 제거한 문자열을 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • 1 ≤ my_string의 길이 ≤ 100
  • letter은 길이가 1인 영문자입니다.
  • my_string과 letter은 알파벳 대소문자로 이루어져 있습니다.
  • 대문자와 소문자를 구분합니다.

 

입출력 예

my_string  letter result
"abcdef" "f" "abcde"
"BCBdbe" "B" "Cdbe"

 

코드 제출 : 

def solution(my_string, letter):
    return ''.join(list(filter(lambda s: ord(s) != ord(letter), my_string)))

해설

더보기

ref : https://docs.python.org/3/library/functions.html#filter

ref : https://docs.python.org/3/library/functions.html#ord

이전에 쓴 filter 로 if 문을 예시로 함. 

풀이하자면 filter(function, iterable) 이고, 함수는 조건문으로서 lambda로 반환을 해서 들어가는 조건 if문을 넣음.

my_string 에서 iteration 하는 요소들에서 대소문자 구분하니까 ord로 구분한 다음에 같지 않으면 list 안에 append 시키는 것으로 하고 만들어진 걸 문자열로 join함.

설명 좋음 : https://blockdmask.tistory.com/532

점수 : 1083 (+1)

 


편지

link : https://school.programmers.co.kr/learn/courses/30/lessons/120898

 

문제 설명

머쓱이는 할머니께 생신 축하 편지를 쓰려고 합니다. 할머니가 보시기 편하도록 글자 한 자 한 자를 가로 2cm 크기로 적으려고 하며, 편지를 가로로만 적을 때, 축하 문구 message를 적기 위해 필요한 편지지의 최소 가로길이를 return 하도록 solution 함수를 완성해주세요.

 

제한사항

  • 공백도 하나의 문자로 취급합니다.
  • 1 ≤ message의 길이 ≤ 50
  • 편지지의 여백은 생각하지 않습니다.
  • message는 영문 알파벳 대소문자, ‘!’, ‘~’ 또는 공백으로만 이루어져 있습니다.

 

입출력 예

message result
"happy birthday!" 30
"I love you~" 22

 

 

코드 제출 : 

def solution(message):
    return len([s for s in message])*2

해설

더보기

문제 그대로. message를 list comprehension으로 하나하나 쪼갠 다음에 len을 구하고 *2 함.

점수 : 1084 (+1)

 


점의 위치 구하기

link : https://school.programmers.co.kr/learn/courses/30/lessons/120841

 

문제 설명

사분면은 한 평면을 x축과 y축을 기준으로 나눈 네 부분입니다. 사분면은 아래와 같이 1부터 4까지 번호를매깁니다.

  • x 좌표와 y 좌표가 모두 양수이면 제1사분면에 속합니다.
  • x 좌표가 음수, y 좌표가 양수이면 제2사분면에 속합니다.
  • x 좌표와 y 좌표가 모두 음수이면 제3사분면에 속합니다.
  • x 좌표가 양수, y 좌표가 음수이면 제4사분면에 속합니다.

x 좌표 (x, y)를 차례대로 담은 정수 배열 dot이 매개변수로 주어집니다. 좌표 dot이 사분면 중 어디에 속하는지 1, 2, 3, 4 중 하나를 return 하도록 solution 함수를 완성해주세요.

 

제한사항

  • dot의 길이 = 2
  • dot[0]은 x좌표를, dot[1]은 y좌표를 나타냅니다
  • -500 ≤ dot의 원소 ≤ 500
  • dot의 원소는 0이 아닙니다.

 

입출력 예

dot  result
[2, 4] 1
[-7, 9] 2

 

 

코드 제출 : 

def solution(dot):
    if dot[0] > 0 and dot[1] > 0:
        return 1
    if dot[0] < 0 and dot[1] > 0:
        return 2
    if dot[0] < 0 and dot[1] < 0:
        return 3
    if dot[0] > 0 and dot[1] < 0:
        return 4

해설

더보기

이런 건 단순한 게 최고라고 생각해서 그냥 if 조건문 여러개.

점수 : 1086 (+2)

 

 


문자 반복 출력하기

link : https://school.programmers.co.kr/learn/courses/30/lessons/120825

 

문제 설명

문자열 my_string과 정수 n이 매개변수로 주어질 때, my_string에 들어있는 각 문자를 n만큼 반복한 문자열을 return 하도록 solution 함수를 완성해보세요.

 

제한사항

  • 2 ≤ my_string 길이 ≤ 5
  • 2 ≤ n ≤ 10
  • "my_string"은 영어 대소문자로 이루어져 있습니다.

 

입출력 예

my_string n result
"hello" 3 "hhheeellllllooo"

 

 

코드 제출 : 

def solution(my_string, n):
    answer = [s*n for s in my_string]
    return ''.join(answer)

 

해설

더보기

join으로 리스트를 문자열로 만들고 그 전에 반복하는 건 리스트 컴프리헨션 이용.

점수 : 1059 (+2)

 


순서쌍의 개수

link : https://school.programmers.co.kr/learn/courses/30/lessons/120836

 

문제 설명

순서쌍이란 두 개의 숫자를 순서를 정하여 짝지어 나타낸 쌍으로 (a, b)로 표기합니다. 자연수 n이 매개변수로 주어질 때 두 숫자의 곱이 n인 자연수 순서쌍의 개수를 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • 1 ≤ n ≤ 1,000,000

 

입출력 예

result
20 6
100 9

 

코드 제출 : 

def solution(n):
    answer = 0
    for i in range(1,n+1):
        if n % i == 0:
            answer += 1
    return answer

해설

더보기
곱이 되는 순서쌍이라 함은 나눴을 때 0이 되는 수들의 갯수인 셈이니 단순하게 카운팅 함.

점수 : 1093(+4)

 


문자열 안에 문자열

link : https://school.programmers.co.kr/learn/courses/30/lessons/120908

 

 

문제 설명

문자열 str1, str2가 매개변수로 주어집니다. str1 안에 str2가 있다면 1을 없다면 2를 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • 1 ≤ str1의 길이 ≤ 100
  • 1 ≤ str2의 길이 ≤ 100

 

입출력 예

str1     
"ab6CDE443fgh22iJKlmn1o" "6CD" 1
"ppprrrogrammers" "pppp" 2

 

코드 제출 : 

def solution(str1, str2):
    return 1 if str1.count(str2) > 0 else 2

해설

더보기
문제 그대로, str1 안에 str2 통으로 count를 했을 때 1개 이상 있다면 있으므로 1 없으면 2

점수 : 1095(+2)

 


제곱수 판별하기

link : https://school.programmers.co.kr/learn/courses/30/lessons/120909

 

문제 설명

어떤 자연수를 제곱했을 때 나오는 정수를 제곱수라고 합니다. 정수 n이 매개변수로 주어질 때, n이 제곱수라면 1을 아니라면 2를 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • 1 ≤ n ≤ 1,000,000

 

입출력 예

n result
144 1
976 2

 


코드 제출 : 

# 제출
def solution(n):
    base = int(n**0.5)
    return 1 if base**2 == n else 2
# math 라이브러리 이용.
import math
def solution(n):
    base = int(math.sqrt(n))
    return 1 if base**2 == n else 2

해설

더보기

ref : https://docs.python.org/3/library/operator.html#mapping-operators-to-functions

파이썬 연산자 제곱 **을 이용.

a ** b 이면 a 를 b 제곱한 건데 여기선 2제곱이라서 제곱의 반인 0.5로 확인 후 그게 맞으면 1 아니면 2 처리

점수 : 1097(+2)

 


 우선 여기까지 16개 part1 로서 풀고 나머지 part2로 밀린 것과 이번주 까지 풀기 예정