Stay Hungry Stay Foolish

프로그래머스 코딩테스트/Level 1

[Programmers] L1. [1차] 비밀지도 (Python)

dev스카이 2024. 11. 12. 14:13

[문제 링크] 👇

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


풀이 방법

  • 입력받은 배열을 한 줄씩 순회하며, arr1과 arr2에서 동일한 위치에 있는 숫자 i와 j를 함께 다룬다.
  • i와 j를 각각 n자리 이진수 문자열로 변환한다. 여기서 i를 이진수로 바꾼 후, n자리 형식으로 맞추기 위해 0을 앞에 추가해 준다.
  • 변환한 두 이진수 문자열을 한 자리씩 비교
    • 같은 위치에 있는 두 비트 값이 둘 중 하나라도 1이면 해당 위치를 #으로,
    • 둘 다 0이면 공백으로 바꾸어 bin_str에 추가
  • bin_str이 완성되면 한 줄의 지도가 생성된 것이므로, 이를 answer에 추가
  • 모든 줄에 대해 반복한 후 answer를 반환하여 전체 지도를 완성

 

 

이진수 변환 후, n 자리 형식에 맞추는 방법

format(i, f'0{n}b')
  • i 는 배열에서 꺼낸 정수이다.
  • f-string을 통해 i 를 2진수로 변환하는데, {n}을 삽입해 n 자리 형식에 맞춘다.
  • b는 2진수를 나타내는 문자이다.

Solution

def solution(n, arr1, arr2):
    answer = []
    # 배열 2진수로 변환, 한 줄 씩
    for i, j in zip(arr1, arr2):
        bin_str = ''
        for first, second in zip(format(i, f'0{n}b'), format(j, f'0{n}b')):
            for f, s in zip(first, second):
                if f == '1' or s == '1':
                    bin_str += '#'
                else:
                    bin_str += ' '
        answer.append(bin_str)
    return answer

 

 

개선할 점

이 코드는 주어진 두 배열 arr1과 arr2를 각각 이진수로 변환하여, 두 값을 비트 OR 연산으로 합쳐가며 벽과 공백을 표현한다. 다만 코드 내 불필요한 중첩 반복문을 줄일 수 있다. 또한, format()을 사용한 2진수 변환과 비트 연산을 결합하여 더 간단하게 작성할 수 있다.

 

개선된 코드

def solution(n, arr1, arr2):
    answer = []
    for i, j in zip(arr1, arr2):
        # 두 값을 OR 연산한 후 n자리 2진수로 변환하여 #과 공백으로 매핑
        bin_str = format(i | j, f'0{n}b').replace('1', '#').replace('0', ' ')
        answer.append(bin_str)
    return answer