[프로그래머스] lv0. 머쓱이 문제(나이 출력, 각도기, 양꼬치, 피자 나눠 먹기, 아이스 아메리카노, 옷가게 할인 받기, 편지, 주사위의 개수, 암호 해독)

주연·2023년 1월 26일
0

Python 문제 풀이

목록 보기
10/20
post-thumbnail

나이 출력

230126

문제

머쓱이는 40살인 선생님이 몇 년도에 태어났는지 궁금해졌습니다. 나이 age가 주어질 때, 2022년을 기준 출생 연도를 return 하는 solution 함수를 완성해주세요.

제한사항
0 < age ≤ 120
나이는 태어난 연도에 1살이며 1년마다 1씩 증가합니다.
입출력 예

ageresult
401983
232000

풀이

def solution(age):
    return 2022 - age + 1

각도기

230126

문제

각에서 0도 초과 90도 미만은 예각, 90도는 직각, 90도 초과 180도 미만은 둔각 180도는 평각으로 분류합니다. 각 angle이 매개변수로 주어질 때 예각일 때 1, 직각일 때 2, 둔각일 때 3, 평각일 때 4를 return하도록 solution 함수를 완성해주세요.

예각 : 0 < angle < 90
직각 : angle = 90
둔각 : 90 < angle < 180
평각 : angle = 180

제한사항
0 < angle ≤ 180
angle은 정수입니다.

풀이

def solution(angle):
    return 1 if angle < 90 else 2 if angle == 90 else 3 if angle < 180 else 4
  • 다른 사람 풀이
def solution(angle):
    answer = (angle // 90) * 2 + (angle % 90 > 0) * 1
    return answer

와...창의력 대박이다. 같은 문제를 풀어도 정말 창의적으로 풀 수 있구나

양꼬치

230126

문제

문제 설명
머쓱이네 양꼬치 가게는 10인분을 먹으면 음료수 하나를 서비스로 줍니다. 양꼬치는 1인분에 12,000원, 음료수는 2,000원입니다. 정수 n과 k가 매개변수로 주어졌을 때, 양꼬치 n인분과 음료수 k개를 먹었다면 총얼마를 지불해야 하는지 return 하도록 solution 함수를 완성해보세요.

제한사항
0 < n < 1,000
n / 10 ≤ k < 1,000
서비스로 받은 음료수는 모두 마십니다.

풀이

def solution(n, k):
    return 12000 * n + 2000 * (k - n//10)

피자 나눠 먹기(1)

230127

문제

문제 설명
머쓱이네 피자가게는 피자를 일곱 조각으로 잘라 줍니다. 피자를 나눠먹을 사람의 수 n이 주어질 때, 모든 사람이 피자를 한 조각 이상 먹기 위해 필요한 피자의 수를 return 하는 solution 함수를 완성해보세요.

제한사항
1 ≤ n ≤ 100

입출력 예

nresult
71
11
153

풀이

def solution(n):
    return n // 7 + (1 if n % 7 != 0 else 0)
  • 다른 사람 풀이
def solution(n):
    return (n - 1) // 7 + 1

와 이 생각을 왜 못 했을까 아주 깔끔하다..

피자 나눠 먹기(2)

230203 (피자나눠먹기끼리 순서 같이 둠)

문제

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

제한사항
1 ≤ n ≤ 100

입출력 예

nresult
61
105
42

풀이

import math

def solution(n):
    return math.lcm(n,6)//6

최소공배수 함수 이용하려고 했으나 3.9버전부터 가능하고 프로그래머스는 Python3이 3.8.5버전이라 이용 못 한다.

def solution(n):
    for i in range(max(n,6),n*6+1):
        if i % n == 0 and i % 6 == 0:
            return i//6

솔직히 구글 검색했다가 나와서 적었다..
결국 내가 푼 게 아님

만약 가장 기본적인 반복문을 사용했으면 나눠떨어질 때까지 반복문 돌려서 나눠떨어지면 return하라 했을 듯..ㅎ

  • 다른 사람 풀이
import math

def solution(n):
    return (n * 6) // math.gcd(n, 6) // 6

오... 최대공약수 이용해서 풀었네
그렇네 최대공약수와 최소공배수의 관계 이용해서 풀면 되는구나
한 번 더 생각하자

def solution(n):
    i=1
    while(1):
        if (6*i)%n==0:
            return i
        i+=1

이렇게 풀었지 않았을까..?

피자 나눠 먹기(3)

230203

문제

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

제한사항
2 ≤ slice ≤ 10
1 ≤ n ≤ 100

입출력 예

slicenresult
7102
4123

풀이

def solution(slice, n):
    for i in range(1,51):
        if slice * i // n:
            return i

흠..그래..

  • 다른 사람 풀이
def solution(slice, n):
    return ((n - 1) // slice) + 1

아 n-1하는거 피자나눠먹기(1)에서 나왔는데 왜 이걸 적용 못 했을까????
자꾸 slice에서 나누는 것만 생각하고 거꾸로 할 생각을 못해서..

아이스 아메리카노

230127

문제

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

제한사항
0 < money ≤ 1,000,000

입출력 예

moneyresult
5,500[1, 0]
15,000[2, 4000]

풀이

#1
def solution(money):
    return [money // 5500, money % 5500]

#2
def solution(money):
    num = money // 5500
    return [num, max(0,money - 5500 * num )]

money % 5500 말고 다른 거 쓸 수 있는게 뭐가 있을까 고민하다 이렇게 했다
오히려 빙 돌아간 느낌..그려..

  • 다른 사람 풀이
def solution(money):
    return divmod(money, 5500)

divmod(): 두 숫자를 나눠 몫과 나머지를 tuple로 반환하는 함수
함수를 사용하자. 아주 깔끔하다.

옷가게 할인 받기

230129

문제

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

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

풀이

def solution(price):
    if price >= 500000:
        price *= 0.8
    elif price >= 300000:
        price *= 0.9
    elif price >= 100000:
        price *= 0.95
    else:
        price

    return int(price)

ㅎ..한줄로 쓰면 너무 길 것 같아 그냥 작성했다. 이게 최선이야..?

  • 다른 사람 코드
def solution(price):
    discount_rates = {500000: 0.8, 300000: 0.9, 100000: 0.95, 0: 1}
    for discount_price, discount_rate in discount_rates.items():
        if price >= discount_price:
            return int(price * discount_rate)

이야.. 딕셔너리사용해서 풀었네 생각도 못 했다. 이제 if else if를 여러번 작성해야한다면 딕셔너리를 이용해봐야겠다.

편지

230201

문제

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

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

입출력 예

messageresult
"happy birthday!"30
"I love you~"22

풀이

def solution(message):
    return len(message) * 2

주사위의 개수

230201

문제

문제 설명
머쓱이는 직육면체 모양의 상자를 하나 가지고 있는데 이 상자에 정육면체 모양의 주사위를 최대한 많이 채우고 싶습니다. 상자의 가로, 세로, 높이가 저장되어있는 배열 box와 주사위 모서리의 길이 정수 n이 매개변수로 주어졌을 때, 상자에 들어갈 수 있는 주사위의 최대 개수를 return 하도록 solution 함수를 완성해주세요.

제한사항
box의 길이는 3입니다.
box[0] = 상자의 가로 길이
box[1] = 상자의 세로 길이
box[2] = 상자의 높이 길이
1 ≤ box의 원소 ≤ 100
1 ≤ n ≤ 50
n ≤ box의 원소
주사위는 상자와 평행하게 넣습니다.

입출력 예

boxnresult
[1, 1, 1]11
[10, 8, 6]312

풀이

import math

def solution(box, n):
    return math.prod(i // n for i in box)

# 가로 길이 // n * 세로 길이 // n * 높이 // n

이것 또한 자릿수 더하기 문제에서 봤던 sum함수 + for문을 생각해 작성하였다.

  • 다른 사람 풀이
import math

def solution(box, n):
    return math.prod(map(lambda v: v//n, box))

for문 대신 map과 lamda를 이용해 풀 수도 있구나!

암호 해독

230201, 230208

문제

문제 설명
군 전략가 머쓱이는 전쟁 중 적군이 다음과 같은 암호 체계를 사용한다는 것을 알아냈습니다.

암호화된 문자열 cipher를 주고받습니다.
그 문자열에서 code의 배수 번째 글자만 진짜 암호입니다.
문자열 cipher와 정수 code가 매개변수로 주어질 때 해독된 암호 문자열을 return하도록 solution 함수를 완성해주세요.

제한사항
1 ≤ cipher의 길이 ≤ 1,000
1 ≤ code ≤ cipher의 길이
cipher는 소문자와 공백으로만 구성되어 있습니다.
공백도 하나의 문자로 취급합니다.

입출력 예

ciphercoderesult
"dfjardstddetckdaccccdegk"4"attack"
"pfqallllabwaoclk"2"fallback"

풀이

  1. 문제를 보고 정리
    #code의 배수 <= len(cipher) 인 동안 for문
    #code 배수의 해당하는 수 뽑기 cipher[배수]
    #문자열 더하기 sum() 안될 듯, join 이용
    를 구현해보고자 했다.
def solution(cipher, code):
    answer = ""
    try:
        for i in range(0,len(cipher)):
            answer += cipher[(code-1) + i * code]
    except IndexError:
        return answer

이와 같이 구현을 했고 join을 이용해보고자 했다.

  1. ''.join(cipher[(code-1) + i * code] for i in range(0,len(cipher)))
    를 구현하고 싶었으나 문제는 범위 설정..
    위와 같이 구현할 시 인덱스가 범위를 벗어난다.
    이걸 try에 넣으면 예외 처리를 어떻게 해야할 지 모르겠음..
    악 모르겠다. 근데 이게 문제가 아니었다.
    걍 끝내고 다른 사람 풀이봐야지 했는데 1,7,8 테스트가 오류났다.
    "abc", 1이 들어왔을 때는 이와 같은 코드로 풀지 못한 다는 것을 확인.

  2. 문자열 하나씩 가져오는데 그 문자열의 인덱스 +1을 code로 나눴을 때 나머지가 0이면 answer에 포함되는 것으로 구현하기로 함

def solution(cipher, code):
    answer = ""
    for i in cipher:
        if (cipher.find(i)) % code == code-1:
            answer += i
    return answer

안됨
모르겠다 집가서 해야지하다 2월 8일 됐다.

다시 해보았다.

def solution(cipher, code):
    return ''.join([list(cipher)[i-1] for i in range(1, len(list(cipher))+1) if i % code == 0])

아 테스트 통과하긴 했는데 너무 길어 한 줄 아닌 한 줄
다시 보자...? 뭐한거지 list왜 쓴거지

def solution(cipher, code):
    return ''.join(cipher[i-1] for i in range(code, len(list(cipher))+1, code))

이야~ 좀 줄었다. 일단 이걸로 만족할래..

  • 다른 사람 풀이
def solution(cipher, code):
    answer = cipher[code-1::code]
    return answer

? ㅋ... 나의 고민은 정말^^..
지금 알아서 다행이다.
array[::]사용법을 항상 기억하자!
(참고: python array[::] 사용법)

profile
공부 기록

0개의 댓글