비밀지도 (프로그래머스, 비트연산자)

CODA·2022년 7월 12일
0




간단한 문제설명

  • 지도 하나는 한변이 n(1~16 int)인 정사각형. 빈칸(''), 벽(#) 으로 구성됨
  • 지도 두개 겹쳐서 전체 지도. 하나라도 벽이면 벽. 모두 공백이여야 공백.
  • 지도의 빈칸, 벽 정보는 0(공백) , 1(벽)으로 암호화됨

개발 flow

  1. 입력받은 arr 두개를 binary로 변경한다 (자릿수 유지 주의)
  2. 변경된 arr를 합연산하는데 이 때 1이 넘어가면 0으로 변경
  3. 다시 문자로 변경

최초 코드

위의 개발 flow를 정한 후 심플하게 저 순서만 밟아서 진행하였다
저 flow에서 몇가지만 알면 코드의 분량을 획기적으로 줄일 수 있다
(아직 아는게 부족해서 하드코딩으로 일일이 다 구현해서 1시간 걸림;)

# 후술하겠지만 코딩에서 진법 바꾸는건 이런 짓 안해도 간단하게 가능하다
def decimal_to_binary(n, criteria): 
    result = "{0:b}".format(int(n)) 
    if len(result) != criteria : # 자릿수 채우려고 한건데 이것도 이렇게 안해도 된다
        num_added = criteria - len(result)
        result = '0'*num_added + result
    return result 

def solution(n, arr1, arr2) :

    arr1_binary = []
    arr2_binary = []
    for elem1 in arr1 : 
        elem1_binary = decimal_to_binary(elem1, n)
        arr1_binary.append(elem1_binary)
    for elem2 in arr2 :
        elem2_binary = decimal_to_binary(elem2, n)
        arr2_binary.append(elem2_binary)
    map_array = []
    for i in range(n) :
        map_elem = int(arr1_binary[i]) + int(arr2_binary[i]) # 12121 : int
        map_elem_str = str(map_elem)
        map_elem_str = map_elem_str.replace('2','1') # 
        if len(map_elem_str) != n :
            num_added = n - len(map_elem_str)
            map_elem_str = '0'*num_added + map_elem_str
        map_array.append(map_elem_str)
    print(f'arr3_binary : {map_array}')
    result = []
    for map_elem in map_array :
        map_elem = map_elem.replace('1','#')
        map_elem = map_elem.replace('0',' ')
        result.append(map_elem)
    return result

위의 흐름을 그대로 유지하되 다음과 같이 변경할 수 있다

개발 flow [개선 ver]

  1. 입력받은 arr 두개를 binary로 변경한다
    • bin()으로 쉽게 가능
    • 자릿수 유지 : zfill 혹은 rjust로 가능 (rjust는 zfill과 기능은 같으나 원하는 문자 설정가능)
  2. 변경된 arr를 합연산하는데 이 때 1이 넘어가면 0으로 변경
    • 이게 곧 비트연산의 OR 연산 : ' | ' 와 같음
  3. 다시 문자로 변경
    • replace 적극활용하기!!! : '12121' => '11111' 이런식으로 문자열 내부에도 사용가능.
def solution(n, arr1, arr2):
    answer = []
    for i,j in zip(arr1,arr2):
        a12 = str(bin(i|j)[2:])
        a12=a12.zfill(n)
        a12=a12.replace('1','#')
        a12=a12.replace('0',' ')
        answer.append(a12)
    return answer

진법 관련 문제가 나오면 다음을 기억하자 !
1. 진수변환은 bin() int() 이런걸로 간단하게 연산자 단위로 쉽게 가능
2. 비트 논리 연산자(and or xor not), 시프트 연산자가 있음(비트 이동)

profile
금융권에 가고싶은 김코다입니다. 취업을 하면 기타치며 조르바처럼 살고파요.

0개의 댓글