https://school.programmers.co.kr/learn/courses/30/lessons/17681
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
def solution(n, arr1, arr2):
results = []
for i in range(n):
result = ''
arr1_b = bin(arr1[i])[2:]
arr2_b = bin(arr2[i])[2:]
if len(arr1_b) < n:
arr1_b = (n-len(arr1_b)) * '0' + arr1_b
if len(arr2_b) < n:
arr2_b = (n-len(arr2_b)) * '0' + arr2_b
for j in range(n):
value = int(arr1_b[j]) + int(arr2_b[j])
if value > 0:
result += '#'
else:
result += ' '
results.append(result)
return results
위 코드는 제가 푼 문제로 이중반복문과 bin() 함수를 사용하여 문제를 해결했습니다.
문제를 해결하고 나서 다른 사람의 풀이를 확인하니 정말 좋은 코드가 있어서 그 코드는 밑에서 이야기 해보도록 하겠습니다.
먼저 저의 코드는 들어오는 숫자값을 모드 이진수의 형태로 만들어주기 위하여
bin()함수를 사용하여 arr1, arr2의 값들을 이진수로 바꾸어 주었습니다.
문제에서는 정수 9 -> 01001, 정수 1 -> 00001로 바꾸어져있었습니다.
하지만 저의 이진수를 확인해보니 정수 9 -> 1001, 정수 1 -> 1로 문제와 다르게 바꾸어져있는 것을 확인할 수 있었습니다.
바뀐 이진수는 n개의 수로 이루어져야 합니다.
그래서 저는 바뀐 이진수의 크기를 확인하여 주어진 n보다 작다면
이진수를 n개의 수로 채워야하기 때문에 n - len()를 통하여 채워야하는 수를 구하고 0을 곱하여 앞부분에 채워주었습니다.
바뀐 이진수를 반복문을 통하여 인덱스를 확인하면서 인덱스 별로 더해주고
1보다 크다면 '#' 을 0보다 작거나 같다면 공백(' ')으로 result에 담아서 문제를 해결하였습니다.
다음은 위에서 이야기한 다른 사람의 풀이입니다.
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
먼저 zip() 함수를 통하여 arr1, arr2의 i, j 받아 bin(i|j)형태로 이진수를 구한것을 확인할 수 있었습니다.
여기서 알게된 점은 '|' 연산자를 통하여 bin(a|b)를 사용하면 a와 b의 이진수를 구하여 각 자리수에 1이 하나라도 있다면 1 없다면 0을 반환하여 이진수를 만들어주는 것입니다.
예를들어 a = 9, b=30 라고 가정하면
9 -> 1001, 30 -> 11110입니다
이때 각 자리수를 확인하여 11111의 값을 반환해줍니다.
- 아래는 bin() 메소드의 사용법입니다.
비트연산자 bin()에 대하여
이번에는 비트연산자 bin()에 대해 알아보도록 하겠다: >>> 0b1010 10 >>> bin(0b1010) '0b1010' >>> bin(0b1010 & 0b100101) '0b0' >>> bin(0b1010 | 0b100101) '0b101111' >>> bin(0b1010 ^ 0b100101) '0b101111' >>> bin(~0b1010) '-0b1011' >>> bin(0
hwan-hobby.tistory.com
그리고 rjust()를 활용하여 주어진 n 만큼의 전체길이를 만들기 위하여 값을 오른쪽으로 밀어주고 나머지를 '0'으로 채워줍니다.
- 아래는 rjust() 메소드의 사용법입니다.
파이썬 rjust () 메소드
파이썬 rjust () 메소드 기술 파이썬 rjust는 ()의 문자열을 반환 이전 정렬 오른쪽 길이 폭의 새로운 문자열에 공백이있는 패딩. 길이가 문자열의 길이보다 작다면 원래의 문자열을 반환한다. 문법
www.w3big.com
마지막으로 replace()통하여 1을 '#'으로, 0을 공백(' ')으로 만들어 해결한 것을 확인할 수 있습니다.
이중반복문을 사용하지 않아 시간도 빠를것으로 예상이 되며 파이썬 내장함수와 문자열 함수를 잘 활용한 풀이인 것 같습니다!
'코딩테스트' 카테고리의 다른 글
[코딩테스트] 프로그래머스 강원도에 위치한 생산공장 목록 출력하기 MySQL (0) | 2022.11.21 |
---|---|
[코딩테스트] 프로그래머스 튜플 파이썬(Python) (0) | 2022.11.21 |
[코딩테스트] 프로그래머스 나이 정보가 없는 회원 수 구하기 MySQL (0) | 2022.11.19 |
[코딩테스트] 프로그래머스 동물 수 구하기 MySQL (0) | 2022.11.18 |
[코딩테스트] 프로그래머스 멀리 뛰기 파이썬(Python) (0) | 2022.11.18 |