https://www.codingame.com/training/easy/chuck-norris
Practice Strings and Encoding with the exercise "Chuck Norris"
Want to practice Strings and encoding? Try to solve the coding challenge "Chuck Norris".
www.codingame.com
위 문제는 크게 2가지로 파트로 나눌 수 있다.
1.이진수변환 2.chuck norris 변환 이다. 이 부분들을 함수로 놓고 코딩을 하면 된다.
1. 이진수 변환
이진수를 변환할 때 어떤 방법을 쓸까?
학교에서는 10진수가 있으면 이를 2로 나누어 가면서 나머지를 역순으로 쓰면 된다고 배웠다.
이를 코드로 써보자
def encodeBinary(x):
answer = ""
while x > 0:
remain = x%2 #나머지
answer += str(remain)
x = x//2 #몫
return answer[::-1]
값을 계속 2로 나누면서 나머지를 answer에 더해간 다음 반대로 출력([::-1]) 하면 결과가 나온다.
이 때 2로 나누는 것은 시프트연산 x<<1 와 같다.
2. chuck norris 변환
1011을 척 노리스 변환 해보자. -> 0 0 00 0 0 00
첫번째 자리인 1은 0 0 으로 표시한다
두번째 자리인 0은 00 0 으로 표시한다
세번째 자리인 1은 0 0 으로 표시한다
네번째 자리인 1은 세번째 자리와 같으므로 0으로 표시한다
비트입력이 왔을 때 연속이 아닌 경우에는 숫자가 0인지 1인지를 출력 후 띄어쓰고 다시 0을 출력하고, 연속인 경우에는 0만 출력하는 것을 알 수 있다.
이를 코드로 작성해보자
def encodeChuckNorris(binaryStr):
answer = ""
pre_bit = "" #이전 비트 값
for x in binaryStr:
if pre_bit != x:
if x == "1": answer += " 0 "
elif x == "0": answer += " 00 "
answer += "0"
return answer[1::]
띄어쓰기가 뒤만 하면 새로운 숫자가 나왔을 때 붙어 나오므로 앞뒤로 띄어쓰기를 한 후 맨 처음 띄어쓰기만 잘라서 출력했다.
3. 호출하기
binaryStr = encodeBinary(str)
answer = encodeChuckNorris(binaryStr)
이렇게 적절히 호출해주면 된다. 이때 문제에서 'c' 와 같은 문자로 들어오므로 이를 아스키코드로 '67'과같이 변환해주는 ord()함수를 쓰면 된다.
'python code' 카테고리의 다른 글
문자열 문제 (0) | 2020.09.16 |
---|---|
너비우선탐색문제 (0) | 2020.09.11 |
The gift(그리디 알고리즘) (0) | 2020.09.10 |