250x250
Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

데이터 놀이터

비밀지도 본문

Python

비밀지도

jjjk84 2023. 8. 16. 21:42
728x90

1. 문제

 

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

입력으로 지도의 한 변 크기 n 과 2개의 정수 배열 arr1, arr2가 들어온다.

원래의 비밀지도를 해독하여 '#'공백으로 구성된 문자열 배열로 출력하라.

 

2. 문제 조건

 

  1. 10진수를 2진수 형태로 변환
  2. 두 정수 배열을 zip 형태로 묶어 원소 하나하나 비교할 것
  3. 비트연산 활용

 

3. 코드 작성

 

def solution(n, arr1, arr2):
    answer = []
    
    for a1, a2 in zip(arr1, arr2):
        temp = bin(a1 | a2)[2:] #ob 제거
        temp = temp.zfill(n)
        temp = temp.replace('1', '#').replace('0', ' ')
        answer.append(temp)

 

 

4.  회고

 

  1. 비트연산에 대해 익숙하지 않아 처음에 for문을 썼더니 시간초과가 났다.
# 시간 초과 답안
def solution(n, arr1, arr2):
    temp1 = []
    temp2 = []
    
    def make_binary(arr, temp):
        for num in arr:
            string = ''
            while num != 1:
                if num % 2 == 0:
                    string = '0' + string
                else:
                    string = '1' + string
                num //= 2

            string = '1' + string
            string.zfill(n)
            temp.append(string)
        return temp
        
    make_binary(arr1, temp1)
    make_binary(arr2, temp2)
    
temp = [int(x)+int(y) for x, y in zip(temp1, temp2)]
    
    for ans in temp:
        ans_str = str(ans)
        if len(ans_str) < n:
            ans_str = ans_str.zfill(n)
            
        ans_str = ans_str.replace('1', '#')
        ans_str = ans_str.replace('2', '#')
        ans_str = ans_str.replace('0', ' ')
            
        answer.append(ans_str)

이후 검색을 통해 이진법 함수, 비트연산에 대해 공부한 후 푸니 코드도 훨씬 간단해졌다. (https://wikidocs.net/121166)

  • 이진법 함수(bin)
    • 십진법 수를 이진법으로 나타내는 함수, 결과 맨 앞에 0b가 붙어 출력되는 걸 조심해야한다.
    • bin 안에는 비트연산을 활용할 수 있다.
      • bin(a & b) : and 조건, 둘 다 1(True)여야 1, 하나라도 0이 있다면 0
      • bin(a | b) : or 조건, 둘 중 하나라도 1이 있다면 1, 둘 다 0이어야 0

다음번에 비슷한 유형의 문제를 만난다면 활용해봐야겠다.

 

2. zfill(), rjust(), ljust()를 복습하는 시간이 되었다.

 

 

728x90

'Python' 카테고리의 다른 글

기초 Python programming 강의 내용 정리 모음  (0) 2023.10.10
I/O, OOP  (2) 2023.10.10