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

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개의 댓글