본문 바로가기

알고리즘/프로그래머스(Python)

[알고리즘] 프로그래머스 비밀지도 / python, 비트연산자

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

구구절절한.. 내코드

trans함수에서 2진수 변환 한뒤에, 1이 들어있는지 하나하나 비교했다.

def trans(n, num):
    if num == 1:
        return '0'*(n-1) + '1'
    if num == 0:
        return '0'*n
    ret = ''
    while True:
        if num % 2 == 0:
            ret += '0'
        else:
            ret += '1'
        num //= 2
        if num == 1:
            ret += '1'
            return '0'*(n-len(ret)) + ret[::-1]
            
def solution(n, arr1, arr2):
    answer = []
    for i in range(n):
        map1 = trans(n, arr1[i])
        map2 = trans(n, arr2[i])
        prt = ''
        for i2 in range(n):
            if '1' in map1[i2] or '1' in map2[i2]:
                prt += '#'
            else:
                prt += ' '
        answer.append(prt)
    return answer

 

✔ 다른 코드

a12 = str(bin(i|j)[2:]) 👉 문제에서 한 지도에 1이 존재하면 #이라고 했으므로 2진수의 각 자리수를 OR연산하는 비트연산자를 사용한다. bin으로 이진수변환하면 맨앞에 'ob'문자가 붙기때문에 잘라줌

이런 비트연산들이 있다..!

a12=a12.rjust(n,'0') 👉 rjust함수로 길이가 n인 문자열을 만들고 a12문자열을 오른쪽으로 몰아넣은 다음 나머지를 0으로 채운다.

파이썬은 별 함수가 다있어서 숏코딩에 항상 놀란다..

def solution(n, arr1, arr2):
    answer = []
    for i,j in zip(arr1,arr2):
        a12 = str(bin(i|j)[2:])
        a12=a12.rjust(n,'0')
        a12=a12.replace('1','#')
        a12=a12.replace('0',' ')
        answer.append(a12)
    return answer