[파이썬] 프로그래머스LV1 비밀지도

청수동햄주먹·2023년 2월 4일
0

파이썬코딩테스트

목록 보기
3/35

프로그래머스 레벨1 비밀지도
원래의 비밀지도를 해독하여 '#', 공백으로 구성된 문자열 배열로 출력하라.

이 문제를 풀기위해 온라인 컴파일러로 몇가지를 확인해야했다.
첫번째로 : 10진수 숫자에 바로 or operation이 가능한지 확인했다.

a = 9
b = 30
print(a|b) # 31
# 01001 | 11110 = 11111 // 9 | 30 = 31

확인 완료! 십진수 숫자에도 바로 or연산이 된다.
그렇다면 숫자를 이진수 숫자로 변환해서 다룰 필요가 없이 마지막에 프린트 할때만 포맷에 맞게 맞춰주면 된다.

왜냐하면 이진수로 바로 바꿔서 프린트 해주게되면..

print(bin(9))
#'0b1001'
print(bin(9))
#'0b11111'

이런식으로 길이가 다른 0b가 붙은 문자열로 프린트가 된다.
따라서 두번째 확인!
i) 불필요한 부분 0b 를 제외하고
ii) 내가 원하는 길이n에 맞게 0이 채워서 이진수 숫자만 문자열만들기

print(bin(9)[2:])
#'1001'
print(bin(9)[2:].zfill(5))
#'01001'

이제 필요한 부분은 다 얻음!
성능화에 대한 고민은 없이 우선 이렇게 풀어서 모든 테스트케이스를 통과 시켰다.

def solution(n, arr1, arr2):
    ans = []
    form = []
    for a,b in zip(arr1,arr2):
        ans.append(bin(a|b)[2:].zfill(n))
    for x in ans:
        x = x.replace('1',"#")
        x = x.replace('0',' ')
        form.append(x)
    return form

이후에 생각해보니 for룹을 두번할 필요없이 지역변수 하나만 할당해줘서 처리를 해준후 리스트에 넣어주면 되어서..

def solution(n, arr1, arr2):
    ans = []
    for a,b in zip(arr1,arr2):
        temp = bin(a|b)[2:].zfill(n)
        temp = temp.replace('1',"#")
        temp = temp.replace('0',' ')
        ans.append(temp)
    return ans

temp.replace().replace()이런식으로 중첩해주면 이상하게 시간이 더걸려서(알아보기!!) 이렇게 간단히 나눠주는게 좋을 것 같다

execution result

테스트 1 〉	통과 (0.01ms, 10.1MB)	통과 (0.01ms, 10.2MB)
테스트 2 〉	통과 (0.02ms, 10.1MB)	통과 (0.01ms, 10MB)
테스트 3 〉	통과 (0.01ms, 10.3MB)	통과 (0.01ms, 10MB)
테스트 4 〉	통과 (0.02ms, 10.2MB)	통과 (0.01ms, 10.3MB)
테스트 5 〉	통과 (0.01ms, 10MB)	    통과 (0.01ms, 10.3MB)
테스트 6 〉	통과 (0.01ms, 10.3MB)	통과 (0.02ms, 10.3MB)
테스트 7 〉	통과 (0.01ms, 10.1MB)	통과 (0.01ms, 10.1MB)
테스트 8 〉	통과 (0.01ms, 10.2MB)	통과 (0.01ms, 10.2MB)

거의 비슷한 성능인듯 하다. 아무래도
1 ≦ n ≦ 16 인 조건이 처음시도 처럼 지역변수 두개를 갖는데에 부담을 주지도 않는 듯하고.

알아둘 method, function

  • string.rjust(길이,'대체문자')
    • rjust 메소드는 길이를 정해둔 스트링을 출력할 때 이용한다.
    • 대체문자를 지정하지 않았다면 빈공간으로 출력된다
  • string.zfill(길이)
    • rjust와는 달리 zero로 자동으로 원하는 길이만큼 채워서 출력해준다.
  • 그 밖의 string method

  • int('숫자',진법base) 2,8,16 -> 10
    • 디폴트는 0 으로 되어있다. 문자열의 형태로 넣어주어야함
    • 진법의 디폴트는 10진법이다. 그밖에 2진법, 8진법 16진법으로 설정할 수 있다
    • 각 진법의 숫자를 10진법 숫자로 출력해준다.
    • 숫자 문자열을 진짜 숫자?로 명시해줄 때 사용
    int('11',2)
     # 3
     int('11',8)
     # 9
     int('11',16)
     # 17
  • bin(), oct(), hex() 10 -> 2,8,16
    • 십진수 수를 이진수, 8진수, 16 진수 스트링으로 출력해준다
    • 스트링 앞에 기호가 같이 붙어서 진법을 명시해준다.
      • binary: 0b
      • octal: 0o
      • hexadexinmal: 0x
  	bin(11)
  	#'0b1011'
  	oct(11)
	#'0o13'
    hex(11)
    #'0xb'
profile
코딩과 사별까지

0개의 댓글