프로그래머스 레벨1 비밀지도
원래의 비밀지도를 해독하여 '#', 공백으로 구성된 문자열 배열로 출력하라.
이 문제를 풀기위해 온라인 컴파일러로 몇가지를 확인해야했다.
첫번째로 : 10진수 숫자에 바로 or operation이 가능한지 확인했다.
a = 9
b = 30
print(a|b) # 31
# 01001 | 11110 = 11111 // 9 | 30 = 31
확인 완료! 십진수 숫자에도 바로 or연산이 된다.
그렇다면 숫자를 이진수 숫자로 변환해서 다룰 필요가 없이 마지막에 프린트 할때만 포맷에 맞게 맞춰주면 된다.
왜냐하면 이진수로 바로 바꿔서 프린트 해주게되면..
print(bin(9))
#'0b1001'
print(bin(9))
#'0b11111'
이런식으로 길이가 다른 0b가 붙은 문자열로 프린트가 된다.
따라서 두번째 확인!
i) 불필요한 부분 0b 를 제외하고
ii) 내가 원하는 길이n에 맞게 0이 채워서 이진수 숫자만 문자열만들기
print(bin(9)[2:])
#'1001'
print(bin(9)[2:].zfill(5))
#'01001'
이제 필요한 부분은 다 얻음!
성능화에 대한 고민은 없이 우선 이렇게 풀어서 모든 테스트케이스를 통과 시켰다.
def solution(n, arr1, arr2):
ans = []
form = []
for a,b in zip(arr1,arr2):
ans.append(bin(a|b)[2:].zfill(n))
for x in ans:
x = x.replace('1',"#")
x = x.replace('0',' ')
form.append(x)
return form
이후에 생각해보니 for룹을 두번할 필요없이 지역변수 하나만 할당해줘서 처리를 해준후 리스트에 넣어주면 되어서..
def solution(n, arr1, arr2):
ans = []
for a,b in zip(arr1,arr2):
temp = bin(a|b)[2:].zfill(n)
temp = temp.replace('1',"#")
temp = temp.replace('0',' ')
ans.append(temp)
return ans
temp.replace().replace()이런식으로 중첩해주면 이상하게 시간이 더걸려서(알아보기!!) 이렇게 간단히 나눠주는게 좋을 것 같다
execution result
테스트 1 〉 통과 (0.01ms, 10.1MB) 통과 (0.01ms, 10.2MB)
테스트 2 〉 통과 (0.02ms, 10.1MB) 통과 (0.01ms, 10MB)
테스트 3 〉 통과 (0.01ms, 10.3MB) 통과 (0.01ms, 10MB)
테스트 4 〉 통과 (0.02ms, 10.2MB) 통과 (0.01ms, 10.3MB)
테스트 5 〉 통과 (0.01ms, 10MB) 통과 (0.01ms, 10.3MB)
테스트 6 〉 통과 (0.01ms, 10.3MB) 통과 (0.02ms, 10.3MB)
테스트 7 〉 통과 (0.01ms, 10.1MB) 통과 (0.01ms, 10.1MB)
테스트 8 〉 통과 (0.01ms, 10.2MB) 통과 (0.01ms, 10.2MB)
거의 비슷한 성능인듯 하다. 아무래도
1 ≦ n ≦ 16 인 조건이 처음시도 처럼 지역변수 두개를 갖는데에 부담을 주지도 않는 듯하고.
알아둘 method, function
int('11',2)
# 3
int('11',8)
# 9
int('11',16)
# 17
bin(11)
#'0b1011'
oct(11)
#'0o13'
hex(11)
#'0xb'