
생각하는대로 코딩은 되지 않는걸 또 실감하였다.
다음번에는 생각을 쭉 해보고 정리를 한 후에 코드를 치려고 노력을 해봐야겠다.
내가 짠 코드에서 좀 더 수정을 한다면 최적화시킬 수 있을 것 같다.
처음 시작하는 단계이기 때문에 최적화를 한다면 괜히 머리만 더 복잡해지고 못풀 것 같았다.
그래서 코드를 간결하게 쓰는 생각하지 않고 잘 동작하여서 정답에 통과하는 것을 목적으로 코드를 작성하였다.
코테 문제들에 어느정도 익숙해진 다음에는 간결하게 쓰는 것도 생각하며 코딩을 해봐야겠다.
문제
문제 설명
1. x의 모든 0을 제거합니다.
2. x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.
3. x가 "1"이 될 때 까지 1~3번을 반복합니다.
4. 리턴 값으로는 [이진 변환의 횟수, 변환 과정에서 제거된 모든 0의 개수] 을 반환합니다.
x = "0111010" -> "1111" -> "100"
=> "1111"의 길이가 4라서, 4를 2진법으로 표현한 "100"으로 변경하였다.
리턴 값 : [이진 변환의 횟수, 변환 과정에서 제거된 모든 0의 개수]
코드
# 1. x의 모든 0을 제거합니다.
# 2. x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.
# x = "0111010" -> "1111" -> "100"
# 리턴 값 : [이진 변환의 횟수, 변환 과정에서 제거된 모든 0의 개수]
def solution(s):
zero_count = 0
change_count = 0
while str(s) != "1":
change_count += 1
# 0. s에 0의 개수를 셉니다.
zero_count += str(s).count('0')
# 1. s의 모든 0을 제거합니다.
s = str(s).replace('0','')
# 2. s의 길이를 2진법으로 표현한 문자열로 바꿉니다.
s = len(s)
if str(s) == "1":
break
# n: 2의 n승
n = 0
result = ""
while 1:
# 2를 n으로 나눈게 2보다 크면 n을 1 키운다
if s / (2 ** n) >= 2:
n += 1
else:
new_lst = ['0'] * (n + 1)
while n >= 0:
if s / (2 ** n) >= 1:
new_lst[n] = '1'
s -= 2 ** n
# n을 1씩 줄인다.
n -= 1
if n < 0:
result = "".join(new_lst[::-1])
break
s = result
answer = [change_count, zero_count]
return answer
코드설명
zero_count와 change_count 변수의 초깃값을 0으로 저장하였다.
- zero_count: 변환 과정에서 제거된 모든 0의 개수
- change_count: 이진 변환의 횟수
s: 함수에 입력되는 매개변수
1. s가 1이 되면 종료되기 때문에 while의 조건으로 1이 아닌 경우에 반복하라고 조건을 넣음
2. 0의 개수를 세서 zero_count에 더한다.
3. s에 0을 다 제거하고 1만 남은 s를 만든다.
4. s의 길이를 s로 저장한다.
5. s의 길이가 1인 경우 종료
6. n 은 2의 n승을 나타낸다. n의 초깃값은 0이다.
7. s를 2로 나눠서 몫이 2보다 크거나 같다면 n += 1을 한다.
=> 이진법이기 때문에 2보다 크면 그 다음 자리로 넘어가게 된다.
8. 7번을 반복하다가 s를 2로 나눠서 몫이 2보다 크거나 같지 않다면 else문을 타게 된다.
9. new_lst 를 만든다.
=> n의 0승까지 있기 때문에 ['0'] * (n + 1)을 해주었다.
10. n이 0보다 크거나 같은 동안 while문을 반복한다.
10-1. 반복문을 돌면서 n을 1씩 줄인다.
10-2. s를 2의 n승으로 나눈게 1보다 크다면 new_lst[n] = '1'을 하고, s값에서 2의 n승을 빼준다.
10-3. 10-1과 10-2를 반복하면서 n이 0보다 작아지면 while문을 탈출하게 된다.
11. n이 0보다 작을 경우 new_lst 변수를 거꾸로 바꿔서 join 함수를 이용해서 하나의 문자열로 바꿔준다.
=> result 변수를 while문 밖에 전역 변수에 선언을 해서 값을 유지시켜준다.
12. s에 result 값을 대입해준다.
13. 0 ~ 12번을 s가 1이 될 때까지 반복한다.
14. s가 1이 되면 [change_count, zero_count] 을 반환해준다.
위의 방법대로 의식의 흐름대로 작성해보면서 고쳤다ㅎㅎ
약 1시간 30분만에 정답!!👏👏
'코테공부' 카테고리의 다른 글
[Python] 코딩 기초 트레이닝 : 주사위 게임 3 (0) | 2023.09.20 |
---|---|
[Python] 연습문제 : 최솟값 만들기 (0) | 2023.09.20 |
[Python] 연습문제 : JadenCase 문자열 만들기 (0) | 2023.09.20 |
[Python] 연습문제 : 최댓값과 최솟값 (0) | 2023.09.20 |
[Python] 스택/큐 : 올바른 괄호 (0) | 2023.09.18 |