본문 바로가기

CodingTest/Programmers

[ 프로그래머스 ] [1차]비밀지도

/  제출 1  /

def solution(n, arr1, arr2):
    answer = []
    for a,b in zip(arr1, arr2):
        col = ''
        bin_row = bin(a|b)[2:]
        if len(bin_row) < n:
            row = '0' * (n - len(bin_row))
            bin_row = row+bin_row
        bin_row = bin_row.replace('1','#')
        bin_row = bin_row.replace('0',' ')
        answer.append(bin_row)
         
    return answer
채점 결과
정확성: 100.0
합계: 100.0 / 100
비트 연산 문제 만나고 싶었던 문제였는데 ! 바로 나와서 재밌게 풀었습니다.
재밌던 것에 비해 시간은 조금 걸린 느낌입니다. 왜? 잘 모르니까.
그래도 어찌어찌 깔끔하게 잘 풀었습니다.
헤매다가 다행히도 길을 잘 찾았네요.
 
일단 정리할 것
1. 파이썬 비트 연산
https://dojang.io/mod/page/view.php?id=2460

10진법 정수를 바로 bin()으로 비트연산 가능합니다.

bin(정수)는 10진법 수(정수)를 2진수로 변환합니다. + 또한 bin(내부) 내부에서 비트연산도 가능합니다.

참고로 한 번 더 되짚자면 int( 2진문자열, 2) 이면 2진수를 10진수로 변환 가능합니다.

 

2. 문자열.replace( a, b ) : 문자열의 a캐릭터를 b로 바꿔줍니다.

 

3. 문자열 곱셈 갑자기 긴가민가 머리 엉켰는데, 정리하자면 문자열에 숫자 곱하면 해당 문자열 반복해서 길어집니다.

 

 


 

/  다른 분들 풀이  /
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
1.
와 , 정말 고민했던 문자열 패딩을 rjust라는 메서드로 깔끔히 구현하셨습니다.
메서드 구현방식이나 작동원리를 아는 것도 중요합니다. 하지만, 이런 방법도 알고 있으면 시간 부족한 상황에서는 참 도움이 될 것 같아 익히고 갑니다.

 

문자열.rjust(길이, 패딩값)
문자열을 길이만큼 왼쪽에서 패딩값을 채워줍니다.
문자열.ljust(길이, 패딩값)

문자열을 길이만큼 오른쪽에서 패딩값을 채워줍니다. ( 혹시 몰라서 그냥 r을 l로 바꿔봤는데 위와 같이 작동하네요:-) )

 

 

2.

0b 접두어는 어떻게 해야할 지 몰라서 배열 슬라이싱으로 구현했는데 다른 분들도 비슷하게 구현하셨습니다.

혹시 더 유용한 방법을 없을까 검색해봤습니다.

 

4. Removing “0b” prefix

To remove the prefixed “0b” string, use array slicing on the string.

 

그냥 슬라이싱으로 하는 것이 정석인가봅니다.