비밀지도 문서의 문제 1 풀이 코드다. if __name__ == "__main__": 아래가 자체 테스트다.
"""비밀지도 (프로그래머스 17681) 풀이와 검증."""
import random
def solution(n, arr1, arr2):
answer = []
for a, b in zip(arr1, arr2):
bits = format(a | b, f"0{n}b")
answer.append(bits.replace("1", "#").replace("0", " "))
return answer
def by_cells(n, arr1, arr2):
"""숫자를 2로 나누며 칸을 하나씩 구한다(오른쪽 칸부터)."""
out = []
for a, b in zip(arr1, arr2):
row = []
for _ in range(n):
wall = a % 2 == 1 or b % 2 == 1
row.append("#" if wall else " ")
a //= 2
b //= 2
out.append("".join(reversed(row)))
return out
if __name__ == "__main__":
assert solution(5, [9, 20, 28, 18, 11], [30, 1, 21, 17, 28]) == ["#####", "# # #", "### #", "# ##", "#####"]
assert solution(6, [46, 33, 33, 22, 31, 50], [27, 56, 19, 14, 14, 10]) == ["######", "### #", "## ##", " #### ", " #####", "### # "]
assert solution(3, [5], [2]) == ["###"]
assert bin(5) == "0b101" and bin(5)[2:].zfill(5) == format(5, "05b") == "00101"
rng = random.Random(17681)
for _ in range(2000):
n = rng.randint(1, 16)
arr1 = [rng.randrange(2 ** n) for _ in range(n)]
arr2 = [rng.randrange(2 ** n) for _ in range(n)]
assert solution(n, arr1, arr2) == by_cells(n, arr1, arr2)
print("ALL CHECKS PASSED")