이숭간 공부기록

[프로그래머스] 파이썬 _ 비밀지도 (2018 KAKAO) ⭕️ 본문

알고리즘/프로그래머스

[프로그래머스] 파이썬 _ 비밀지도 (2018 KAKAO) ⭕️

이숭간 2021. 5. 28. 00:28
728x90

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

문제유형 : 구현

 

문제풀이

딱히 어렵진 않았던 문제지만 신박한 파이썬 내장함수를 배우게되어 정리한다.

  • 10진수 2진수 변환 : bin()
  • 나는 이걸 몰랐어서 그냥 재귀로 10진수에서 2진수로 변환하는 tobinary()함수를 만들어서 썼다.
    • >>> bin(10)
      '0b1010' // 앞에붙은 0b를 없애려면 슬라이스기능을 이용해서 [2:] 요로코롬
  • 오른쪽 정렬후 원하는문자로 메우기 : rjust() 
    • val = "77".rjust(5, "0")
      >> 77000
      
      자매품 (왼쪽정렬)
      val = "77".ljust(5, "0")
      >> 00077
  • 그리고 이문제는 0,1로 이루어진 문자열을 활용해서 비트연산자(논리합)을 하면 쉽게 풀수 있었다.
    • 비트 논리합은 같은 자리에 하나라도 1이면 해당 자리의 연산 결과가 1이며 둘 다 0일 때만 0이다. 예를 들어 a가 6이고 b가 3일 때 a|b는 7입니다.(110 | 011 => 111)

 

정답코드:

global target

def solution(n, arr1, arr2):
    arr1_list = []
    arr2_list = []
    answer = []
    global target
    target = n
    for i in range(n):
        arr1_list.append(tobinary([], arr1[i]))
        arr2_list.append(tobinary([], arr2[i]))
    print(arr1_list)

    for i in range(n):
        string = ''
        for j in range(n):
            # 둘다 0일때만 공백이고 나머지는 벽
            if arr1_list[i][j] == 0 and  arr2_list[i][j] == 0:
                string += ' '
            else:
                string += '#'
        answer.append(string)
    return answer

# number to binary
def tobinary(binary, number):
    if (number <= 1):
        binary.append(number)
        while(len(binary)<target):
            binary.append(0)
        return binary[::-1]
    binary.append(number % 2)
    return tobinary(binary, number // 2)

 

정답코드2 (210706):

def solution(n, arr1, arr2):
    
    result = []
    
    for i in list(zip(arr1, arr2)):
        a = bin(i[0])[2:].rjust(n,"0")
        b = bin(i[1])[2:].rjust(n,"0")
        temp = ''
        for i in list(zip(a,b)):
            temp += str(int(i[0])|int(i[1]))
        result.append(temp)
       
    answer = []
    for i in result:
        i = i.replace("1", "#")
        i = i.replace("0", " ")
        answer.append(i)
        

    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

 

추가 : 파이썬 진수다루기

https://www.daleseo.com/python-int-bases/