출처: https://meyouus.tistory.com/64 [정보 공유 - For Me For You For Us]
본문으로 바로가기

주어진 배열의 숫자들을 2진법의 수로 바꾸고, 규칙에 따라 #를 추가해주고 출력해야하는 문제이다.

def solution(n, arr1, arr2):
    answer = []
    for i in range(len(arr1)):
        line = ""
        arr1_base = ['0']*(n-len(format(arr1[i], 'b'))) + list(format(arr1[i], 'b'))
        arr2_base = ['0']*(n-len(format(arr2[i], 'b'))) + list(format(arr2[i], 'b'))
        for j in range(n):
            if arr1_base[j] == '1' or arr2_base[j] == '1':
                line += "#"
            else:
                line += " "
        answer.append(line)
    return answer


내가 풀었던 방식은 다음과 같다.

  1. arr1arr2 각각의 원소에 대하여 이들의 2진법의 수를 리스트로 만들어주고,
  2. 만약 이 리스트들 둘 중 하나에서 1 이 있다면 line 이라는 빈 문자열에 #를 추가해준다.
  3. 1이 없다면 공백 문자열을 추가해준다.
  4. 각각의 i에 대하여 line 문자열을 answer 리스트에 추가해준다.
  5. 마지막에 answer 리스트를 되돌려준다.

이렇게 풀어도 맞으나, 아예 다른 방식으로 푼 사람도 있다:


다른 사람의 풀이

다음은 프로그래머스에서 가장 많은 좋아요를 받은 풀이이다:

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


여기서 bin(i|j)의 경우, 2진법으로 만든 i와 2진법으로 만든 j에서 각 자릿수를 비교하여 둘 중 하나만 1 이면 1로 만들어주는 함수이다. 따라서 a12는 각 자릿수 중 하나라도 1이라면 그 자릿수에 1이 포함되어 있다.

rjust의 경우, str.rjust(width[, fillchar]) 인데, width는 문자열의 전체 길이 후 지정된 채우기 문자를 지정한다. fillchar은 채워진 문자, 기본값은 공백이다. str.rjust()는 기본적으로 반환 이전 문자열을 오른쪽으로 정렬하고, width 길이를 지정해주고, 앞의 str.이 이 width 길이를 만족하지 않는다면 fillcharstr. 앞에 추가해준다. 길이가 문자열의 길이보다 작다면 원래의 문자열을 반환한다.

마지막으로 '1'은 '#'로 바꿔주고, '0'은 ' '로 바꿔주고 answer 리스트에 추가해준다.



조금 더 효율적인 비트연산자와 rjust() 메소드를 알아갈 수 있어서 좋았던 것 같다.