[프로그래머스] Lv1 - [1차] 비밀지도

김멉덥·2023년 7월 25일
0

알고리즘 공부

목록 보기
69/171
post-thumbnail
post-custom-banner

문제

프로그래머스 2018 KAKAO BLIND RECRUITMENT


코드 구현

def decode_to_binary(a, n):     # 10진수 -> 2진수
    binary = ''
    while(a > 0):       # 2진수 구하기
        div = a // 2
        left = a % 2
        binary += str(left)
        a = div

    ans_binary = binary[::-1]   # 왼쪽 -> 오른쪽으로 집어넣어주었기 때문에 정답인 2진수를 얻기 위해서 한번 뒤집어주기

    if(len(ans_binary) < n):    # 만약 n의 길이보다 짧다면, 왼쪽에 부족한 길이만큼 0을 추가로 붙여주기
        ans_binary = ('0' * (n - len(binary))) + ans_binary

    return ans_binary

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

    # "지도 1 벽" or "지도 2 벽" == 벽
    # "지도 1 공백" and "지도 2 공백" = 공백

    # 벽 == 1, 공백 == 0
    # 벽 == '#', 공백 == ' '

    # 이진법 변환하기
    for i in range(n):
        arr1[i] = decode_to_binary(arr1[i], n)
        arr2[i] = decode_to_binary(arr2[i], n)

        # 둘 다 0이면 -> 공백
        # 둘 중 하나라도 1이면 -> 벽
        ans = ''
        for j in range(n):
            if(arr1[i][j] == '0' and arr2[i][j] == '0'):    # 공백
                ans += ' '
            if (arr1[i][j] == '1' or arr2[i][j] == '1'):    # 벽
                ans += '#'
        answer.append(ans)

    # print(arr1)
    # print(arr2)

    return answer

풀이

  • 문제 풀기 전, 투두리스트를 작성하고 문제를 푸는 습관을 키우려고 하는 중이다.
    # TODO
    ## 각 배열의 값을 이진법으로 변환 (ex. 9 -> 01001)
    ## 두 배열 다 공백인건 공백, 두 배열 중 하나만 벽이면 벽 -> 최종 배열 만들기
    ## 정답 출력하기
  • 생각보다 2진수로 변환하는 부분이 제일 까다로웠다.
    • 2진수를 만들 때, list를 따로 선언해서 넣어주고 또 합쳐주기 싫어서 그냥 문자열에 추가하는 방식으로 하였더니 순서가 거꾸로 나왔다. → str[::-1] 로 문자열 뒤집어주기
    • n과 길이가 맞지 않으면 0을 채워넣어주어 n과 길이를 맞게 해주어야 한다. → ans_binary = ('0' * (n - len(binary))) + ans_binary
  • 그 이후 만들어진 2진수를 비교하며 둘 다 0이면 공백 추가, 둘 중 하나라도 1이면 벽 추가

What I learned

감탄한 다른 사람의 정답코드

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

▶️ bin() : 10진수 → 2진수

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

>>> bin(42)
'0b101010'

추가 ) 8진수, 16진수 : oct(), hex()

>>> oct(42)
'0o52'
>>> hex(42)
'0x2a'

→ 앞에 붙는 접두어를 제외하고 0과 1로만 이루어진 값을 얻기 위해서는 bin(x)[2:] 해주면 된다.

▶️ zip(a, b) : a에서 하나, b에서 하나씩 뽑아서 묶어주는 역할

참고 : https://www.daleseo.com/python-zip/

>>> for number, upper, lower in zip("12345", "ABCDE", "abcde"):
...     print(number, upper, lower)
...
1 A a
2 B b
3 C c
4 D d
5 E e

▶️ 문자열.rjust(전체 길이, 공백 대체 문자) : 오른쪽으로 문자열을 밀어넣고 → 문자열이 만약 전체 길이를 다 채우지 못한다면 공백 대체 문자로 나머지 빈공간을 채운다.

참고 : https://maktubi.tistory.com/129

name = ["mijin", "gummy", "mjk", "K"]
for i in name:
    print(i.rjust(8, "."))
    
"""
실행 결과
...mijin
...gummy
.....mjk
.......K
"""
profile
데굴데굴 뚝딱뚝딱 개발기록
post-custom-banner

0개의 댓글