0223 TIL

looggi·2023년 2월 23일
0

TILs

목록 보기
2/114
post-thumbnail

파이썬

리스트 음수 인덱스

  1. 리스트에서 음수 인덱스를 사용하면 어떻게 되나요?
    리스트에 음수 인덱스를 적용하게 되면 뒤에서 n번째 요소를 가리키게 됩니다.

list[-n:]: 뒤에서부터 n번째요소부터 끝까지
list[:-n]: 뒤에서부터 n번째요소 -1까지

프로그래머스 문제풀기

➡️ [1차] 비밀지도

def solution(n, arr1, arr2):
    answer=[]
    for a in arr1:
        new=[]
        for i in range(n-1,-1,-1): 
            if a>=2**(i):
                a=a-2**(i)
                new.append('1')
            else:
                new.append('0')
        answer.append(''.join(new))
    answer2=[]
    for a in arr2:
        new=[]
        for i in range(n-1,-1,-1): 
            if a>=2**(i):
                a=a-2**(i)
                new.append('1')
            else:
                new.append('0')
        answer2.append(''.join(new))
    real=[]
    for i,j in zip(answer,answer2):
        final=[]
        for x in range(n):
            if '1' in i[x] or '1' in j[x]:
                final.append('#')
            else:
                final.append(' ')
        real.append(''.join(final))
    return real

range(n-1,-1,-1)는 reversed(range())로 대체할 수 있다

이진법으로 바꾸기

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
  • a | b: 비트연산자 정수든 이진법이든 상관없이 비트연산의 결과가 나옴
    a나 b 둘 중 하나가 1이면 1 둘 다 0이면 0ㅁ
    ex. 3 | 4 => 7 (11⑵|(100⑵=>111⑵)
  • bin( ): 십진법 -> 이진법 0b이진법 이렇게 나와서 인덱스 2부터 슬라이싱하면 이진법 숫자만 나옴
    결과값 type은 str이기때문에 위에서 str은 빼도 됨
  • rjust( ): 문자열.rjust(총문자열길이,채울문자)
  • ljust( ): 문자열은 왼쪽 정렬되고 오른쪽에 채워짐
  • zfill( ): 문자열.zfill(숫자) 문자열 길이를 숫자만큼 만들고 모자라면 왼쪽에 0을 채워줌

작은 수일 경우 5자리가 모두 채워지지 않을 수도 있기때문에 rjust로 왼쪽에 생기는 빈칸만큼 0을 채우고 이후에 replace로 1은 #으로 0은 공백으로 바꿔준다

  • replace는 있는 걸 다 바꿔준다. 하나만 바꾸고 싶으면 뒤에 숫자를 써줘야하고 왼쪽부터 차례대로 바뀐다

누군가의 comment 🦜

replace를 쓰면 한 번의 순회만으로도 가능한 '#', ' '로의 변환을 두 번하게 만듭니다. 그리고 zip을 쓰면 쓸데없는 공간을 더욱 차지하게 됩니다.
replace 대신 하나의 for문을, zip 대신 range(n)을 사용하는 게 더욱 효율적인 풀이입니다

❓for문으로 string 요소를 어떻게 바꾸지??

  • 인덱스로 접근하려고 하면 string은 item assignment가 안된다고하고
  • 요소자체로 접근하면 에러는 안나지만 변경된 값이 반영이 안되고
  • 결국 리스트로 바꿔서 인덱스로 접근해서 바꿔줬는데 이러면 이게 더 나은 방법이 아닌 것 같은데 어떻게 하는 걸까
    시간도 공간도 이게 더 복잡도가 높음
  • 여기 나온 테스트케이스 한정일 수도 있지만 꼭 저렇게 코멘트 한 게 정답이라고 보장할 수 도 없는 것 같다 range로 바꾼 게 메모리를 더 많이 잡아먹음

정규식 사용

import re
def solution(n, arr1, arr2):
    answer = ["#"]*n # 길이의 배열을 먼저 만들어두고
    for i in range(n):
        answer[i] = str(bin(arr1[i]|arr2[i]))[2:]
        answer[i] = re.sub('1', '#', answer[i].zfill(n))
        answer[i] = re.sub('0', ' ', answer[i])
    return answer
  • 길이만큼의 리스트를 먼저 만들어두고
    요소값을 바꾸는 방법
  • re.sub(찾을 문자, 바꿀 문자, 대상문자열)

❓이상하게 range(0,n)이 range(n)보다 더 빠르다 진짜 몇번을 해봐도 똑같다 왜그럴까??? ❓

profile
looooggi

0개의 댓글