[프로그래머스 코테 연습] 비밀지도

Gorae·2021년 6월 16일
0

알고리즘

목록 보기
13/19
post-thumbnail

문제 요약

지도는 한 변의 길이가 n인 정사각형 배열 형태, 각 칸은 "공백"(" ") 또는 "벽"("#")으로 이루어져 있다.
전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다.
지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽, 모두 공백인 부분만 전체 지도에서도 공백.
"지도 1"과 "지도 2"는 각각 정수 배열로 암호화되어 있다.
암호화된 배열은 지도의 각 가로줄에서 벽을 1, 공백을 0으로 부호화했을 때 얻어지는 이진수에 해당하는 값의 배열이다.
원래의 비밀지도를 해독하여 '#', 공백으로 구성된 문자열 배열로 출력하라.

나의 풀이


def solution(n, arr1,arr2):
    answer = []
    arr_1 = []
    arr_2 = []

    for i in arr1:
        a = ""
        while i>=2:
            a += str(i%2)
            i //= 2
        if i<2:
            a += str(i)
        a = a[::-1] if len(a)==n else "0"*(n-len(a))+ a[::-1]
        arr_1.append(a)

    for i in arr2:
        a = ""
        while i>=2:
            a += str(i%2)
            i //= 2
        if i<2:
            a += str(i)
        a = a[::-1] if len(a)==n else "0"*(n-len(a))+ a[::-1]
        arr_2.append(a)

    for i in range(n):
        a = ""
        for j in range(n):
            if arr_1[i][j]=="0" and arr_2[i][j]=="0":
                a += " "
            else:
                a += "#"
        answer.append(a)

    return answer

bin(), zfill() 활용 풀이

def solution(n, arr1, arr2):
    answer = []
    for i,j in zip(arr1,arr2):
        a12 = str(bin(i|j)[2:])
        a12=a12.zfill(n)
        a12=a12.replace('1','#')
        a12=a12.replace('0',' ')
        answer.append(a12)
    return answer

zfill() 함수

문자열 길이를 지정하면, 빈자리는 앞부터 0으로 채워 반환한다.

s =91657.zfill(8)
# 00091657
for i in range(3):
    print(str(i).zfill(4))
# 0000
# 0001
# 0002

진수 변환 함수

bin() : 2진수 변환, “0ba” 반환

bin(10) =0b1010bin(301) =0b100101101

oct() : 8진수 변환, “0oa” 반환

oct(10) =0o12oct(233) =0o351

hex() : 16진수 변환, “0xa” 반환

hex(10) =0xahex(145) =0x91

위의 함수 대신 int(x, 진수정보)로도 변환할 수 있다.

int(0b1010, 2) = 10
int(0o12, 8) = 10
int(0xa, 16) = 10

비트 연산자

& : and
| : or
^ : xor
~ : not

느낀점

  • 내 코드는 통과는 됐지만, 요령 없이 같은 코드를 반복해 구현했다. 사용할 수 있는 함수를 떠올리는 습관을 들이자, 그 전에 함수를 더 많이 알아야겠지만!
  • bin(), zfill() 활용 코드가 효율성 측면에서도 더 좋았다.
  • zfill() 대신 rjust()를 사용할 수도 있었는데, 효율성, 정확성 측면에서 큰 차이가 없었으나, zfill()이 좀 더 간단했다.
profile
좋은 개발자, 좋은 사람

0개의 댓글