2021. 8. 28. 17:34ㆍAlgorithm
1. 문제분석
https://programmers.co.kr/learn/courses/30/lessons/17681
코딩테스트 연습 - [1차] 비밀지도
비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다
programmers.co.kr
문제는 간단한 2진법 문제이다.
2. 풀이
1) 2진법으로 변환하여 1과 0으로 된 지도를 만든다. (2개의 지도)
2) 좌표를 하나씩 탐색하며 두 지도는 합친 지도를 만든다.
def solution(n, arr1, arr2):
arr1_bin=[]
arr2_bin=[]
for x,y in zip(arr1,arr2):
a =bin(x)[2:]
b =bin(y)[2:]
while len(a)<n:
a="0"+a
while len(b)<n:
b="0"+b
arr1_bin.append(a)
arr2_bin.append(b)
answer = []
for i,j in zip(arr1_bin,arr2_bin):
line=""
for ii,jj in zip(i,j):
if ii=="1" or jj =="1":
line+="#"
else:
line+=" "
answer.append(line)
return answer
python에서는 진법 변환 함수들을 내장함수로 지원한다. ( bin, oct,hex)
binary로 변환하면 0b~~ 로 반환되기 때문에 index2 부터 slicing 하고 자리수를 맞춰주었다.
문제를 맞추긴 했지만 전혀 파이썬 스럽지 않은 지저분한 코드여서 마음에 들진 않았다.
3. 다른풀이
def solution(n, arr1, arr2):
calc = [bin(x|y)[2:].rjust(n,"0") for x,y in zip(arr1,arr2)]
result = [line.replace("0"," ").replace("1","#") for line in calc]
return result
이번엔 bit 연산과 list comprehension을 통해 단 두줄로 풀이했다.
python의 비트연산은 아래와 같이 6가지가 있다.
| a & b | Bitwise AND | Bits defined in both a and b |
| a | b | Bitwise OR | Bits defined in a or b or both |
| a ^ b | Bitwise XOR | Bits defined in a or b but not both |
| a << b | Bit shift left | Shift bits of a left by b units |
| a >> b | Bit shift right | Shift bits of a right by b units |
| ~a | Bitwise NOT | Bitwise negation of a |
출처 : https://jakevdp.github.io/WhirlwindTourOfPython/04-semantics-operators.html
문제의 퍼즐의 한 칸이 한 bit를 가리키고(2진법) 첫번째 퍼즐과 두번째 퍼즐의 or 연산을 요구하기 때문에
bin(x|y) 를 통해 문제는 사실 다 풀린 셈이다.
내장함수 rjust 는 문자열 정렬함수이다. rjust는 오른쪽으로 정렬하는 함수이고 왼쪽,가운데로는 ljust,center를 쓸 수 있다.
str.rjust(width[, fillchar])
오른쪽으로 정렬된 문자열을 길이 width 인 문자열로 돌려줍니다. 지정된 fillchar (기본값은 ASCII 스페이스)을 사용하여 채웁니다. width 가 len(s) 보다 작거나 같은 경우 원래 문자열이 반환됩니다.
출처 : python 공식 문서
slicing과 rjust로 문자열을 정리한 후엔 이제 0을 " "으로 , 1을 "#"으로 바꾸기만하면 완성이다.
여기도 str 내장함수 replace를 이용하면 간단하다.
4. 후기
문제풀이를 할때 내장함수들이 잘 생각이 안나서 그냥 하드코딩할 때가 많은데
기본 내장함수들은 잘 익혀서 바로바로 쓸수 있도록 해야겠다.
좀더 pythonic한 코드를 짜보도록 노력!
'Algorithm' 카테고리의 다른 글
| [algorithm] 2018 Kakao Blind Recruitment 1차 - 추석 트래픽 (0) | 2021.09.07 |
|---|---|
| [algorithm] 2018 Kakao Blind Recruitment 1차 - 프렌즈4블록 (0) | 2021.09.07 |
| [algorithm] 2018 Kakao Blind Recruitment 1차 - 뉴스 클러스터링 (0) | 2021.09.06 |
| [algorithm] 2018 Kakao Blind Recruitment 1차 - 캐시 (0) | 2021.09.06 |
| [algorithm] 2018 Kakao Blind Recruitment 1차 - 다트게임 (0) | 2021.08.29 |