본문 바로가기

python code

Chuck Norris 문제풀이

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