알고리즘(백준, 프로그래머스)/[프로그래머스] Lv1

[프로그래머스] Lv1. [1차] 비밀지도 for 카카오 - 파이썬(Python)

마법사 코딩공주 2023. 5. 12. 16:24
728x90
반응형

문제링크 : https://school.programmers.co.kr/learn/courses/30/lessons/17681

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📝 문제설명

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

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

🔗입출력예

 


👉 문제풀이

  • 비트연산에 대한 문제이다. 이게 포인트임
  • 처음엔  아래처럼 풀었는데 틀렸다고한다.
  • 그래서 print(a)를 출력해봤더니.. 자리수가 안맞았다.
  • 해결방법 zfill(n)을 사용하여 왼쪽에 0을 채워주어 길이를 n으로 맞췄다.

1. 오류 코드

def solution(n, arr1, arr2):
    answer = []
    for i in range(n):
        a = bin(arr1[i] | arr2[i]) #  결과 '0b11111'
        a = a[2:]
        print(a)
        a = a.replace('1', '#').replace('0', ' ')
        answer.append(a)
        
    return answer

2. 해결코드

def solution(n, arr1, arr2):
    answer = []
    for i in range(n):
        a = bin(arr1[i] | arr2[i]) #  결과 '0b11111'
        a = a[2:].zfill(n)
        a = a.replace('1', '#').replace('0', ' ')
        answer.append(a)
        
    return answer

 

👉 다른사람 문제풀

  1. i와 j를 | 비트 OR 연산자를 사용하여 합친 후, bin() 함수를 사용하여 이진수 문자열로 변환합니다. bin(i|j)[2:]를 통해 변환된 이진수 문자열을 얻습니다. ([2:]는 0b 접두사를 제거하기 위해 사용됩니다.)
  2. rjust(n, '0')을 사용하여 문자열의 길이를 n으로 맞추고, 오른쪽 정렬된 문자열을 생성합니다. 부족한 자릿수는 '0'으로 채웁니다. 이렇게 함으로써 모든 이진수 문자열의 길이가 n이 되도록 합니다.
  3. replace() 함수를 사용하여 문자열에서 '1'을 '#'으로, '0'을 공백으로 대체합니다.
  4. 변환된 문자열 a12를 answer 리스트에 추가합니다.
  5. 모든 원소에 대해 반복이 완료되면 answer 리스트를 반환합니다.

rjust()는 문자열의 오른쪽을 정렬하고, 필요한 만큼의 길이를 추가하여 문자열을 맞추는 메서드입니다. 여기서는 a12.rjust(n, '0')을 사용하여 a12 문자열의 길이를 n으로 맞추고, 부족한 자릿수는 '0'으로 채웁니다. rjust()의 첫 번째 인자는 원하는 문자열 길이를, 두 번째 인자는 채울 문자로 사용할 문자를 지정합니다.

예를 들어, a12가 '101'이고 n이 5일 경우, a12.rjust(n, '0')은 '00101'을 반환합니다. a12의 길이가 5가 되도록 오른쪽을 정렬하고, 부족한 자릿수는 '0'으로 채워집니다.

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

 

※ 참고

728x90
반응형