알고리즘 풀이/프로그래머스

[Level 1] 비밀 지도

mhko411 2021. 2. 19. 10:18
728x90

programmers.co.kr/learn/courses/30/lessons/17681

 

코딩테스트 연습 - [1차] 비밀지도

비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다

programmers.co.kr


접근

문제를 봤을 때 " | " 연산자가 생각이 났다.

두 개의 배열의 각각 원소를 OR 연산을 하여 맵을 출력하면 됐다.

 

구현

arr1과 arr2에 있는 같은 인덱스의 숫자끼리 OR연산을 하여 bin()을 통해 2진수로 변환한다. 그렇다면 앞에 0b가 붙은 문자형으로 변환이 된다. 

이때 인덱스 2부터 검사를 하여 1이면 # 0이면 공백을 해주는데 전달받은 n자리를 맞춰줘야 한다. 

만약 2진수로 변환한 값이 0110이면 앞에 0은 제거된고 110으로 표현되기 때문에 자리가 맞지 않는 문제가 발생하였다.

따라서 부족한 부분만큼 while문을 통해 0을 먼저 채워주고 시작을 하였다.

def solution(n, arr1, arr2):
    answer = []
    for i in range(n):
        b = bin(arr1[i]|arr2[i])
        word = ''
        if len(b) < n+2:
            m = n+2 - len(b)
            while m:
                word += ' '
                m -= 1
        for j in range(1, len(b)):
            if b[j] == '1':
                word += '#'
            elif b[j] == '0':
                word += ' '
        answer.append(word)
    return answer

 

다른 사람의 풀이

zip()을 통해 arr1과 arr2의 원소를 짝에 맞게 묶어준다.

이후 bin()을 통해 OR연산 진행 후에 2번 인덱스부터 슬라이싱하여 b에 저장

앞에 0을 채우기위해 rjust()를 사용하였다. => 원하는 자릿수 만큼 '0'을 앞에 채움 '0' 대신 다른 문자가 올 수도 있다.

그리고 replace를 통해 '1' -> '#', '0' ->' '으로 변경한다.

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

'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글

[Level 2] 전화번호 목록  (0) 2021.02.19
[Level 3] 2xn 타일링  (0) 2021.02.19
[Level 1] 2016년  (0) 2021.02.19
[Level 1] 문자열 내 마음대로 정렬하기  (0) 2021.02.19
[Level 1] 크레인 인형 뽑기  (0) 2021.02.18