3 분 소요

치킨 쿠폰

문제 설명

프로그래머스 치킨은 치킨을 시켜먹으면 한 마리당 쿠폰을 한 장 발급합니다. 쿠폰을 열 장 모으면 치킨을 한 마리 서비스로 받을 수 있고, 서비스 치킨에도 쿠폰이 발급됩니다. 시켜먹은 치킨의 수 chicken이 매개변수로 주어질 때 받을 수 있는 최대 서비스 치킨의 수를 return하도록 solution 함수를 완성해주세요.


제한사항

  • chicken은 정수입니다.
  • 0 ≤ chicken ≤ 1,000,000

입출력 예

chicken result
100 11
1,081 120

문제 풀이

def solution(chicken):
    answer = 0
    rest = 0
    
    while chicken > 10:
        rest += chicken%10
        chicken = chicken // 10
        answer += chicken
    if chicken == 10:
        answer += 1
    return answer + rest // 10

실패..◑﹏◐

다시 생각하기

치킨 한 마리당 쿠폰 한 마리 지급합니다.

쿠폰 열장 ▶ 치킨 한 마리

시켜 먹은 치킨 수를 매개변수 chicken으로 줍니다.

그러면 chicken == 발급될 쿠폰 수

def solution(chicken):
    service = 0
    while chicken >= 10:
        service += chicken // 10
        chicken = chicken % 10 + chicken //10
    return service

다른 풀이

def solution(chicken):
    return int(chicken*0.11111111111)

이것은 10%의 10%의 10%의.. 이렇게 되기 때문에 이러한 식이 나올 수 있다고 합니다.. 대단하신듯..

<div class = “notice”, markdown=”1” > 파이썬의 divmod() 내장 함수 두 개의 수를 대상으로 //연산자와 %연산자를 각각 호출하는 방법입니다. 두 개의 숫자를 인자로 받아서 첫번째 숫자를 두번째 숫자로 나눈 몫과 나머지를 튜플 형태로 반환합니다. python x, y = divmod(1081, 10) print(x, y) >>> 108, 1 </div>

이진수 더하기

문제 설명

이진수를 의미하는 두 개의 문자열 bin1bin2가 매개변수로 주어질 때, 두 이진수의 합을 return하도록 solution 함수를 완성해주세요.


제한사항

  • return 값은 이진수를 의미하는 문자열입니다.
  • 1 ≤ bin1, bin2의 길이 ≤ 10
  • bin1bin2는 0과 1로만 이루어져 있습니다.
  • bin1bin2는 “0”을 제외하고 0으로 시작하지 않습니다.

입출력 예

bin1 bin2 result
“10” “11” “101”
“1001” “1111” “11000”

풀어보기

def solution(bin1, bin2):
    nums = []
    for i in [bin1, bin2]:
        num = 0
        for j, k in enumerate(i[::-1]):
            if k == "1":
                num += 2**j
        nums.append(num)
    binnum = sum(nums)
    anwser = ''
    while binnum > 0:
        x, y = divmod(binnum, 2)
        binnum = x
        if binnum == 1:
            anwser += str(y)
        else:
            anwser += str(y)
    return anwser[::-1]    

다섯번째 테스트 케이스에서 문제가 발생했습니다.

이럴 때는 제약사항을 다시 한번 보며 생각해봅니다. bin1과 bin2는 0과1로만 구성되어있는 문자열이고 리턴 값은 정수가 아닌 문자열입니다.

또 bin1과 bin2는 “0”을 제외하고 0으로 시작하지 않습니다. 이 제약사항을 간과한것 같은 느낌이 듭니다.

그렇다면 “0”과 “0”이 주어졌을때는 어떨까요? while에 속하지 않기 때문에 그냥 빈 문자열 anwser을 출력하게 됩니다. 이에 대해 조건을 추가해주겠습니다.

def solution(bin1, bin2):
    nums = []
    for i in [bin1, bin2]:
        num = 0
        for j, k in enumerate(i[::-1]):
            if k == "1":
                num += 2**j
        nums.append(num)
    binnum = sum(nums)
    anwser = ''
    while binnum > 0:
        x, y = divmod(binnum, 2)
        binnum = x
        if binnum == 1:
            anwser += str(y)
        else:
            anwser += str(y)
    if anwser == '':
        return "0"
    return anwser[::-1]    

생각보다 코드의 길이가 너무 깁니다. 다른 방법은 없을까요? ✍(◔◡◔)

숫자를 다른 진수로 변환

2진수, 8진수, 16진수는 각각 bin(), oct(), hex()을 사용해서 숫자를 변환할 수 있는데 변환 시 앞에 접두어가 붙습니다.

  • 2진수: 0b
  • 8진수: 0o
  • 16진수: 0x

즉, 숫자를 함수안에 넣으면 위의 접두어가 붙어서 진수가 출력됩니다.

접두어가 붙은 진수를 숫자형으로 변환하려면 어떻게 해야할까요?

int()함수에 진수의 기준 값을 추가 인자로 넣어줍니다.

```python
num = 77
print(bin(num))
>>> 0b1001101
two = "0b1001101"
print(int(two, 2))
```
def solution(bin1, bin2):
    num = sum([int("0b" + i, 2) for i in [bin1, bin2]])
    return bin(num)[2:]

>
def solution(bin1, bin2):
    return bin(sum([int("0b" + i, 2) for i in [bin1, bin2]]))[2:]
def solution(bin1, bin2):
    return bin(int(bin1,2) + int(bin2,2))[2:]

A로 B 만들기

문제 설명

문자열 beforeafter가 매개변수로 주어질 때, before의 순서를 바꾸어 after를 만들 수 있으면 1을, 만들 수 없으면 0을 return 하도록 solution 함수를 완성해보세요.


제한사항

  • 0 < before의 길이 == after의 길이 < 1,000
  • beforeafter는 모두 소문자로 이루어져 있습니다.

입출력 예

before after result
“olleh” “hello” 1
“allpe” “apple” 0

문제 풀이

def solution(before, after):
    for i in before:
        after = after.replace(i,"",1)
    return int(len(after) == 0)

다른 풀이

def solution(before, after):
    return int(sorted(before)== sorted(after))

업데이트:

댓글남기기