<로직 고민>
- 일단 입력값으로 들어오는 arr1과 arr2를 이진수로 바꿔서 배열에 넣어야겠군
- 그 다음엔 for문을 n만큼 2번 돌려서 arr1과 arr2를 비교해서 둘 다 1이면 #, 둘 중 하나만 1이면 #, 둘 다 0이면 " "을 넣어주면 되지 않을까
def solution(n, arr1, arr2):
answer = []
binary_arr1 = list(map(lambda x: str(bin(x))[2:].zfill(n), arr1))
binary_arr2 = list(map(lambda x: str(bin(x))[2:].zfill(n), arr2))
for i in range(n):
cipher = ""
for j in range(n):
if binary_arr1[i][j] == binary_arr2[i][j]:
if binary_arr1[i][j] == 1:
cipher += "#"
else:
cipher += " "
else:
cipher += "#"
answer.append(cipher)
return answer
- 일단 이렇게 풀어봤다
- 값이 배열 안에 문자열이 있는데 문자열 하나하나를 비교해야 하니 for문을 2번 돌렸다
- 2번째 for문이 돌아가는 동안 cipher라는 변수에 # 또는 공백이 들어가게 하고 다 돌면 answer에 붙여주고 첫 번째 for문이 다시 돌면 cipher는 리셋된다
- 뭔가 풀릴 줄 알았는데 이렇게 하니까...흠....
- 안 된다,,
- 뭔가 문제를 잘못 이해했나?
- 지금 둘 다 0일 때랑 둘 중 하나가 1일 때 공백이랑 #이 잘 들어가는데 둘 다 1일 때 #이 안 들어간다..왜지...?
- 아 알았다......지금 binary_arr는 문자열이 들어가 있는데 if문 조건을 숫자형으로 써서 2번째 if문 통과가 안 되는 거였다
- 1을 "1"로 바꿔주니 테스트 통과...!!
<완성된 코드>
def solution(n, arr1, arr2):
answer = []
binary_arr1 = list(map(lambda x: str(bin(x))[2:].zfill(n), arr1))
binary_arr2 = list(map(lambda x: str(bin(x))[2:].zfill(n), arr2))
for i in range(n):
cipher = ""
for j in range(n):
if binary_arr1[i][j] == binary_arr2[i][j]:
if binary_arr1[i][j] == "1":
cipher += "#"
else:
cipher += " "
else:
cipher += "#"
answer.append(cipher)
return answer
- 근데 이렇게 보니 cipher += "#" 이게 2군데에 있어서 뭔가 안 좋아보인다
- if문을 너무 남발한 것 같다
- 모두 0인 경우를 빼면 다 #인 거니까 그렇게 바꿔주는 게 좋을 듯
def solution(n, arr1, arr2):
answer = []
binary_arr1 = list(map(lambda x: str(bin(x))[2:].zfill(n), arr1))
binary_arr2 = list(map(lambda x: str(bin(x))[2:].zfill(n), arr2))
for i in range(n):
cipher = ""
for j in range(n):
if binary_arr1[i][j] == "0" and binary_arr2[i][j] == "0":
cipher += " "
else:
cipher += "#"
answer.append(cipher)
return answer
print(solution(5, [9, 20, 28, 18, 11], [30, 1, 21, 17, 28]))
# ['#####', '# # #', '### #', '# ##', '#####']
print(solution(6, [46, 33, 33, 22, 31, 50], [27, 56, 19, 14, 14, 10]))
# ['######', '### #', '## ##', ' #### ', ' #####', '### # ']
<해설>
- 아 비트연산을 사용해서 풀어야 하는 문제였구나...
def solution(n, arr1, arr2):
answer = []
binary_arr = list(map(lambda x, y: bin(x | y), arr1, arr2))
for i in range(n):
cipher = ""
for j in range(2, len(binary_arr[0])):
if binary_arr[i][j] == "0":
cipher += " "
else:
cipher += "#"
answer.append(cipher)
return answer
이렇게 다시 풀어봤는데 8번째 줄에서 에러가 난다..
Traceback (most recent call last):
File "c:\Users\l\Desktop\sparta\algorithm\prac.py", line 18, in <module>
print(solution(6, [46, 33, 33, 22, 31, 50], [27, 56, 19, 14, 14, 10]))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "c:\Users\l\Desktop\sparta\algorithm\prac.py", line 8, in solution
if binary_arr[i][j] == "0":
~~~~~~~~~~~~~^^^
IndexError: string index out of range
- 앞에 0b를 빼려다가 그런 건데 그냥 binary_arr 할 때부터 0b를 빼야겠다
def solution(n, arr1, arr2):
answer = []
binary_arr = list(map(lambda x, y: format(x | y, "b"), arr1, arr2))
for binary in binary_arr:
binary = binary.replace("0", " ")
binary = binary.replace("1", "#")
answer.append(binary)
return answer
- 이렇게 풀었는데 맨 앞이 공백이 오는 경우에 그냥 공백이 없어진다....
- 그래서 열심히 찾아보니까 rjust()라는 함수가 있다
- 자리수에 맞춰서 왼쪽에 원하는 문자로 채울 수 있는 함수다
def solution(n, arr1, arr2):
answer = []
binary_arr = list(map(lambda x, y: format(x | y, "b"), arr1, arr2))
for binary in binary_arr:
binary = binary.replace("0", " ")
binary = binary.replace("1", "#")
answer.append(binary.rjust(n))
return answer
print(solution(5, [9, 20, 28, 18, 11], [30, 1, 21, 17, 28]))
# ['#####', '# # #', '### #', '# ##', '#####']
print(solution(6, [46, 33, 33, 22, 31, 50], [27, 56, 19, 14, 14, 10]))
# ['######', '### #', '## ##', ' #### ', ' #####', '### # ']
- 이렇게 하니까 답이 제대로 나왔다
<다른 사람 풀이>
- 천재풀이1
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() 함수를 썼다
- zip() 함수도 정리를 한 번 해야겠군
- 내 2번째 풀이에서 rjust()를 해야 했던 이유가 그냥 앞에 공백이면 없어져서 그런 건 줄 알았는데 이 풀이를 보니까 이진수 비트연산 했을 때 2번째 예시의 경우 자리수가 5자리인 값이 있었다 그래서 애초에 맨 앞이 0이 오는 경우가 없었던 거였는데 그걸 몰랐다 ㅋㅋㅋ그냥 맨 앞이 공백이면 그냥 없어지는 줄,,,
- 그래서 append할 때 rjsut를 썼지만 이 사람이 푼 것처럼 replace 함수 사용하기 전에 rjust를 써도 되겠단 생각이 들었다
- 근데 append 할 때 쓰는 게 더 깔끔해 보이는 거 같기도 하고 ㅋㅋㅋ
- 아니 애초에 비트연산 써서 2진수로 바꿀 때 자리수 맞춰주는 게 더 좋을 것 같다
<내 풀이 최종 정리>
- 해설 보기 전 풀이
def solution(n, arr1, arr2):
answer = []
binary_arr1 = list(map(lambda x: str(bin(x))[2:].zfill(n), arr1))
binary_arr2 = list(map(lambda x: str(bin(x))[2:].zfill(n), arr2))
for i in range(n):
cipher = ""
for j in range(n):
if binary_arr1[i][j] == "0" and binary_arr2[i][j] == "0":
cipher += " "
else:
cipher += "#"
answer.append(cipher)
return answer
- 해설 보고 난 후 풀이
def solution(n, arr1, arr2):
answer = []
binary_arr = list(map(lambda x, y: format(x | y, "b"), arr1, arr2))
for binary in binary_arr:
binary = binary.replace("0", " ")
binary = binary.replace("1", "#")
answer.append(binary.rjust(n))
return answer
- 다른 사람 풀이 보고 난 후 풀이
def solution(n, arr1, arr2):
answer = []
binary_arr = list(map(lambda x, y: format(x | y, "b").rjust(n), arr1, arr2))
for binary in binary_arr:
binary = binary.replace("0", " ")
binary = binary.replace("1", "#")
answer.append(binary)
return answer