[코딩테스트 입문]Day24
치킨 쿠폰
문제 설명
프로그래머스 치킨은 치킨을 시켜먹으면 한 마리당 쿠폰을 한 장 발급합니다. 쿠폰을 열 장 모으면 치킨을 한 마리 서비스로 받을 수 있고, 서비스 치킨에도 쿠폰이 발급됩니다. 시켜먹은 치킨의 수 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>
이진수 더하기
문제 설명
이진수를 의미하는 두 개의 문자열 bin1
과 bin2
가 매개변수로 주어질 때, 두 이진수의 합을 return하도록 solution 함수를 완성해주세요.
제한사항
- return 값은 이진수를 의미하는 문자열입니다.
- 1 ≤
bin1
,bin2
의 길이 ≤ 10 bin1
과bin2
는 0과 1로만 이루어져 있습니다.bin1
과bin2
는 “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 만들기
문제 설명
문자열 before
와 after
가 매개변수로 주어질 때, before
의 순서를 바꾸어 after
를 만들 수 있으면 1을, 만들 수 없으면 0을 return 하도록 solution 함수를 완성해보세요.
제한사항
- 0 <
before
의 길이 ==after
의 길이 < 1,000 before
와after
는 모두 소문자로 이루어져 있습니다.
입출력 예
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))
댓글남기기