국문과 유목민

37. 비밀지도 찾기 본문

알고리즘_코딩테스트/프로그래머스_Level1

37. 비밀지도 찾기

논곰 2020. 9. 12. 23:28

0. 문제

링크) https://programmers.co.kr/learn/courses/30/lessons/17681

 

코딩테스트 연습 - [1차] 비밀지도

비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다

programmers.co.kr


1. 알고리즘 계획

  1. 정수값을 이진수로 가공한다.
  2. for문을 돌면서 규칙에 해당하는 값으로 새로운 리스트르 만든다.
  3. 다른 for문에서 새로운 리스트를 돌면서 값을 변화시켜준다. 


2. 나의 코드

def solution(n, arr1, arr2):
    ls2  = []
    answer = []
    # 정수 가공
    tmp1 = ['0'*(n-len(format(i,'b')))+format(i,'b') if len(format(i,'b')) != n else format(i, 'b') for i in arr1]
    tmp2 = ['0'*(n-len(format(i,'b')))+format(i,'b') if len(format(i,'b')) != n else format(i, 'b') for i in arr2]
    # for문
    for x, y in zip(tmp1, tmp2):
        ls = ['0' if (int(x[i])+int(y[i])) == 0 else '1' for i in range(len(tmp1))]
        ls2.append(ls)
    for v in ls2:
        ls3 = ['#' if v[i] == '1' else ' ' for i in range(len(v))]
        answer.append("".join(ls3))
    return answer

- foramt(정수, 'b')를 하면 정수가 이진수로 바뀐다고 한다.

- 이전의 코드에서 배운 zip함수를 사용해 두 리스트를 한 개의 for문에서 돌려봤다.


3. 다른 사람의 코드

def solution2(n, arr1, arr2):
    answer = []
    for i, j in zip(arr1, arr2):
        a12 = str(bin(i | j)[2:])
        print(a12)
        a12 = a12.rjust(n, '0')
        a12 = a12.replace('1', '#')
        a12 = a12.replace('0', ' ')
        answer.append(a12)
    return answer

- 굉장히 간단하게 문제를 해결했다.

- str(bin(arr1[i]|arr2[i]))[2:]  #핵심코드라고 생각한다.

 └ bin()함수를 사용하게 되면 앞에 두 단어 '0b'가 붙는다. 

- rjust(길이, '값'):  str값이 주어진 '길이'에 부족하면 '값' 을 앞에다가 채워준다.

 └ 정수 '1'의 경우 이진수도 '1'이기 때문에 앞에 '0'을 채워줘야 한다.

- replace(): 해당 값을 다른 값으로 변경


4. 정리 및 리뷰

- 확실히 코드를 간략화해보고, 다양한 함수를 사용해본 사람은 코드의 길이와 속도의 차이가 확실히 난다고 생각한다.

- 다양한 함수들에 대해 이해하고 외워둬야겠다.

- 그래도 아예 코딩테스트를 하기 전에는 엄두도 내지 못했을 문제였다고 생각하니, 많이 성장했다는 생각이 들었다. 


코드 만족도: ★★★


'알고리즘_코딩테스트 > 프로그래머스_Level1' 카테고리의 다른 글

39. 다트확률 구하기  (0) 2020.09.12
38. 실패율  (0) 2020.09.12
36. 예산  (0) 2020.09.12
35. 별 찍기  (0) 2020.09.12
34. X만큼 간격이 있는 n개의 숫자  (0) 2020.09.12