[プログラマー]level 1 2018 KAKAO BLIND RECRUITMENT[第1ラウンド]秘密マップ
10581 ワード
2018 KAKAO BLIND RECRUITMENT[1]シークレットマップ
これは基本的な二次元配列問題のようですが、問題を解くときに新しく知った内容があるので、書きます.
ニオは秘密の地図を手に持って、プロドが普段私房のお金を隠している場所を教えた.しかし、この秘密地図はデジタル暗号化されており、位置を確認するために解読が必要です.幸いなことに、地図のパスワードを解読する方法が書かれたメモも見つかった.
n
の正方形の配列です.1
に符号化し、空白部分を0
に符号化したときに得られるバイナリ値の配列である.ニオがフロドの私房金を手に入れるために、秘密地図のパスワードを解読するのに役立つプログラムを作成しました.
入力フォーマット
地図に入る枠線のサイズ
n
と2つの整数配列arr1
、arr2
を入力します.n
≦ 16 arr1
,arr2
は整数配列であり、長さはn
である.x
をバイナリ数に変換した場合の長さn
以下.すなわち、0≤|2 n-1を満たす.出力フォーマット
元の秘密マップを復号し、
x
、'#'
からなる文字列配列に出力します.💻 コード#コード#
import string
tmp = string.digits + string.ascii_lowercase
def convert(num, base):
q, r = divmod(num, base)
if q == 0:
return tmp[r]
else:
return convert(q, base) + tmp[r]
def solution(n, arr1, arr2): # [9, 20, 28, 18, 11]
answer = []
# 1. 지도 두 개 만들기
map1 = [['' for _ in range(n)] for _ in range(n)]
map2 = [['' for _ in range(n)] for _ in range(n)]
for idx, i in enumerate(arr1): # 9 20 28 ...
#print(convert(i, 2).zfill(n))
for jdx, j in enumerate(convert(i, 2).zfill(n)):
map1[idx][jdx] = j
#print(map1[idx][jdx])
for idx, i in enumerate(arr2): # 9 20 28 ...
#print(convert(i, 2).zfill(n))
for jdx, j in enumerate(convert(i, 2).zfill(n)):
map2[idx][jdx] = j
#print(map2[idx][jdx])
# 2. 두 개의 지도 합치기
board = [['' for _ in range(n)] for _ in range(n)]
for i in range(n):
for j in range(n):
if map1[i][j] == '1' or map2[i][j] == '1':
board[i][j] = '#'
else:
board[i][j] = ' '
# print(board) # [['#', '#', '#', '#', '#'], ['#', '', '#', '', '#'],
for row in board:
answer.append(''.join(row))
return answer
2進数に変換すると、01001が必要で、前の0が遮断され、1001の形で現れます.この場合,zfill(width)関数を用いて解決できる.str形式で入らなければなりません.
# '01001'
'1001'.zfill(5)
Reference
この問題について([プログラマー]level 1 2018 KAKAO BLIND RECRUITMENT[第1ラウンド]秘密マップ), 我々は、より多くの情報をここで見つけました https://velog.io/@hh3990/2018-KAKAO-BLIND-RECRUITMENT-1차-비밀지도テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol