[algorithm] 2018 Kakao Blind Recruitment 1차 - 비밀지도

2021. 8. 28. 17:34Algorithm

1. 문제분석

 

https://programmers.co.kr/learn/courses/30/lessons/17681

 

코딩테스트 연습 - [1차] 비밀지도

비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다

programmers.co.kr

문제는 간단한 2진법 문제이다.

 

2. 풀이

 

1) 2진법으로 변환하여 1과 0으로 된 지도를 만든다. (2개의 지도)

2) 좌표를 하나씩 탐색하며 두 지도는 합친 지도를 만든다.

def solution(n, arr1, arr2):
    arr1_bin=[]
    arr2_bin=[]
    for x,y in zip(arr1,arr2):
        a =bin(x)[2:]
        b =bin(y)[2:]
        while len(a)<n:
            a="0"+a
        while len(b)<n:
            b="0"+b
        arr1_bin.append(a)
        arr2_bin.append(b)
    answer = []
    for i,j in zip(arr1_bin,arr2_bin):
        line=""
        for ii,jj in zip(i,j):
            if ii=="1" or jj =="1":
                line+="#"
            else:
                line+=" "
        answer.append(line)
    return answer

python에서는 진법 변환 함수들을 내장함수로 지원한다. ( bin, oct,hex)

binary로 변환하면 0b~~ 로 반환되기 때문에 index2 부터 slicing 하고 자리수를 맞춰주었다.

 

문제를 맞추긴 했지만 전혀 파이썬 스럽지 않은 지저분한 코드여서 마음에 들진 않았다.

 

 

3. 다른풀이

 

def solution(n, arr1, arr2):
    calc = [bin(x|y)[2:].rjust(n,"0") for x,y in zip(arr1,arr2)]
    result = [line.replace("0"," ").replace("1","#") for line in calc]
    return result

이번엔 bit 연산과 list comprehension을 통해 단 두줄로 풀이했다.

 

python의 비트연산은 아래와 같이 6가지가 있다.

a & b Bitwise AND Bits defined in both a and b
a | b Bitwise OR Bits defined in a or b or both
a ^ b Bitwise XOR Bits defined in a or b but not both
a << b Bit shift left Shift bits of a left by b units
a >> b Bit shift right Shift bits of a right by b units
~a Bitwise NOT Bitwise negation of a

출처 : https://jakevdp.github.io/WhirlwindTourOfPython/04-semantics-operators.html

 

문제의 퍼즐의 한 칸이 한 bit를 가리키고(2진법) 첫번째 퍼즐과 두번째 퍼즐의 or 연산을 요구하기 때문에 

bin(x|y) 를 통해 문제는 사실 다 풀린 셈이다.

 

내장함수 rjust 는 문자열 정렬함수이다.  rjust는 오른쪽으로 정렬하는 함수이고 왼쪽,가운데로는 ljust,center를 쓸 수 있다.

 

str.rjust(width[, fillchar])

오른쪽으로 정렬된 문자열을 길이 width 인 문자열로 돌려줍니다. 지정된 fillchar (기본값은 ASCII 스페이스)을 사용하여 채웁니다. width  len(s) 보다 작거나 같은 경우 원래 문자열이 반환됩니다.

출처 : python 공식 문서

 

slicing과 rjust로 문자열을 정리한 후엔 이제 0을 " "으로 , 1을 "#"으로  바꾸기만하면 완성이다.

여기도 str 내장함수 replace를 이용하면 간단하다.

 

 

4. 후기

 

문제풀이를 할때 내장함수들이 잘 생각이 안나서 그냥 하드코딩할 때가 많은데

기본 내장함수들은 잘 익혀서 바로바로 쓸수 있도록 해야겠다.

좀더 pythonic한 코드를 짜보도록 노력!