주어진 배열의 숫자들을 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
내가 풀었던 방식은 다음과 같다.
arr1
과arr2
각각의 원소에 대하여 이들의 2진법의 수를 리스트로 만들어주고,- 만약 이 리스트들 둘 중 하나에서
1
이 있다면line
이라는 빈 문자열에#
를 추가해준다. 1
이 없다면 공백 문자열을 추가해준다.- 각각의
i
에 대하여line
문자열을answer
리스트에 추가해준다. - 마지막에
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
길이를 만족하지 않는다면 fillchar
을 str.
앞에 추가해준다. 길이가 문자열의 길이보다 작다면 원래의 문자열을 반환한다.
마지막으로 '1'은 '#'로 바꿔주고, '0'은 ' '로 바꿔주고 answer
리스트에 추가해준다.
조금 더 효율적인 비트연산자와 rjust()
메소드를 알아갈 수 있어서 좋았던 것 같다.
'알고리즘 테스트 > 프로그래머스 문제풀이 및 해설' 카테고리의 다른 글
<프로그래머스 문제풀이: [1차] 다트> Level 1 - 파이썬 (0) | 2020.12.03 |
---|---|
<프로그래머스 문제풀이: 실패율> Level 1 - 파이썬 (0) | 2020.12.02 |
<프로그래머스 문제풀이: 예산> Level 1 - 파이썬 (0) | 2020.11.30 |
<프로그래머스 문제풀이: 직사각형 별찍기> Level 1 - 파이썬 (0) | 2020.11.29 |
<프로그래머스 문제풀이: x만큼 간격이 있는 n개의 숫자> Level 1 - 파이썬 (0) | 2020.11.28 |