- refer : https://school.programmers.co.kr/learn/courses/30/lessons/17681
- 플랫폼 : Programmers (Level1)
- 특이사항 : 2018 KAKAO BLIND RECRUITMENT 1차
간단한 문제설명
- 지도 하나는 한변이 n(1~16 int)인 정사각형. 빈칸(''), 벽(#) 으로 구성됨
- 지도 두개 겹쳐서 전체 지도. 하나라도 벽이면 벽. 모두 공백이여야 공백.
- 지도의 빈칸, 벽 정보는 0(공백) , 1(벽)으로 암호화됨
개발 flow
- 입력받은 arr 두개를 binary로 변경한다 (자릿수 유지 주의)
- 변경된 arr를 합연산하는데 이 때 1이 넘어가면 0으로 변경
- 다시 문자로 변경
위의 개발 flow를 정한 후 심플하게 저 순서만 밟아서 진행하였다
저 flow에서 몇가지만 알면 코드의 분량을 획기적으로 줄일 수 있다
(아직 아는게 부족해서 하드코딩으로 일일이 다 구현해서 1시간 걸림;)
# 후술하겠지만 코딩에서 진법 바꾸는건 이런 짓 안해도 간단하게 가능하다
def decimal_to_binary(n, criteria):
result = "{0:b}".format(int(n))
if len(result) != criteria : # 자릿수 채우려고 한건데 이것도 이렇게 안해도 된다
num_added = criteria - len(result)
result = '0'*num_added + result
return result
def solution(n, arr1, arr2) :
arr1_binary = []
arr2_binary = []
for elem1 in arr1 :
elem1_binary = decimal_to_binary(elem1, n)
arr1_binary.append(elem1_binary)
for elem2 in arr2 :
elem2_binary = decimal_to_binary(elem2, n)
arr2_binary.append(elem2_binary)
map_array = []
for i in range(n) :
map_elem = int(arr1_binary[i]) + int(arr2_binary[i]) # 12121 : int
map_elem_str = str(map_elem)
map_elem_str = map_elem_str.replace('2','1') #
if len(map_elem_str) != n :
num_added = n - len(map_elem_str)
map_elem_str = '0'*num_added + map_elem_str
map_array.append(map_elem_str)
print(f'arr3_binary : {map_array}')
result = []
for map_elem in map_array :
map_elem = map_elem.replace('1','#')
map_elem = map_elem.replace('0',' ')
result.append(map_elem)
return result
위의 흐름을 그대로 유지하되 다음과 같이 변경할 수 있다
개발 flow [개선 ver]
- 입력받은 arr 두개를 binary로 변경한다
- bin()으로 쉽게 가능
- 자릿수 유지 : zfill 혹은 rjust로 가능 (rjust는 zfill과 기능은 같으나 원하는 문자 설정가능)
- 변경된 arr를 합연산하는데 이 때 1이 넘어가면 0으로 변경
- 이게 곧 비트연산의 OR 연산 : ' | ' 와 같음
- 다시 문자로 변경
- replace 적극활용하기!!! : '12121' => '11111' 이런식으로 문자열 내부에도 사용가능.
def solution(n, arr1, arr2):
answer = []
for i,j in zip(arr1,arr2):
a12 = str(bin(i|j)[2:])
a12=a12.zfill(n)
a12=a12.replace('1','#')
a12=a12.replace('0',' ')
answer.append(a12)
return answer
진법 관련 문제가 나오면 다음을 기억하자 !
1. 진수변환은 bin() int() 이런걸로 간단하게 연산자 단위로 쉽게 가능
2. 비트 논리 연산자(and or xor not), 시프트 연산자가 있음(비트 이동)