[Py_Lv1]비밀지도

Sunghun📈·2021년 9월 23일
0

프로그래머스

목록 보기
53/93
post-thumbnail

문제 설명

네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.

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

네오가 프로도의 비상금을 손에 넣을 수 있도록, 비밀지도의 암호를 해독하는 작업을 도와줄 프로그램을 작성하라.

제한 사항

입력으로 지도의 한 변 크기 n 과 2개의 정수 배열 arr1, arr2가 들어온다.

  • 1 ≦ n ≦ 16
  • arr1, arr2는 길이 n인 정수 배열로 주어진다.
  • 정수 배열의 각 원소 x를 이진수로 변환했을 때의 길이는 n 이하이다. 즉, 0 ≦ x ≦ 2n - 1을 만족한다.

입출력 예

원래의 비밀지도를 해독하여 '#', 공백으로 구성된 문자열 배열로 출력하라.

접근법

문제에 핵심을 생각했던 부분은 크게 2가지였다.

첫번째가 10진수를 2진수로 변환하는것이고, 두번째는 변환된 2진수값을
or 연산자로 비교하여 2개의 암호된 지도를 하나로 합치는 과정이다.

파이썬의 많은 기능을 능숙하게 사용하지 못하다 보니
핵심적인 개념은 이해했으나 구현하는게 무척이나 투박하다

파이썬을 이용하는 만큼 그 장점을 좀 더 살리는 코드가 필요해 보인다.

그래서 다른 사람의 풀이를 추가 첨부하고 이를 분석해서 흡수하는 시간을
가져보겠다.

zip(arr1, arr2)이 일단 핵심으로 꼽을 수 있다.
[9, 20, 28, 18, 11], [30, 1, 21, 17, 28]을 zip으로 묶고 출력할 경우
(9,30), (20,1)과 같은 결과를 얻을 수 있다. 후드에 달린 지퍼와 같이 둘을
엮어주는 느낌이다.

str(bin(i|j)[2:]이 가장 중요한 핵심이다.
bin()은 10진수를 2진수로 변환해주는 함수이다. 이안에 i|j를 넣으면
2진수로 변환된 상태에서 or 연산을 수행한다.
연산의 결과는 "0b1111"이 나온다. 여기서 0b는 이진수를 나타내는 접두사이다
그렇기 때문에 슬라이싱을 통해 뒤에 값만을 사용한다.

세번째는 rjust와 replace이다.
rjust의 경우 문자열의 오른쪽 정렬을 할때 사용한다.
rjust(n,'0')을 통해 오른쪽 정렬 후 n-문자열의수 만큼 빈공간을 0으로
채워준다. for문을 돌려 어렵게 풀어냈지만 이렇게 간단하게도 해결이 가능하다

replace는 문자열 내 특정 문자를 다른걸로 변환해준다.
이 부분도 for 문으로 어렵게 구현했지만 이렇게 쉽게도 구현이 가능하다.

다른분이 풀이한 답변을 보며 참 깔끔하고 대단하다고 느꼈다.

그냥 넘어갔던 함수들이 이렇게도 사용될 수 있다는것에 또 놀라기도 했다.

더 열심히 노력하는 수 밖에 없겠다.

=============================================================

# 직접 풀이한 코드
def binary(n, arr): #2진수로 변환되는 함수선언
    result = []
    
    for i in range(len(arr)):
        bin_change = []
        num = arr[i]
        while num >= 1:
            bin_change.append(num % 2)
            num = num // 2
            
        for space in range(n-len(bin_change)):
            bin_change.append(0)
            
        bin_change.reverse()
        result.append(bin_change)
    
    return result

def solution(n, arr1, arr2):
    answer = []
    
    arr1 = binary(n, arr1)
    arr2 = binary(n, arr2)
    
    for i in range(n): # 2진수로 변환된 삼수에 or 연사자를 이용해 값을 기호로 변환
        block =''
        for j in range(n):
            if (arr1[i][j] | arr2[i][j]) == 1:
                block +='#'
            else:
                block += ' '
                
        answer.append(block)
                                  
    return answer
# 다른 사람의 풀이
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
profile
데이터 분석과 AI 분야의 전문가를 꿈꾸는 청년

0개의 댓글