728x90

# 해당 포스팅은 이제 막 알고리즘 공부를 시작한 초보 수준에서 작성했음을 이해해주시고, 비난보다는 따뜻한 조언을 부탁드립니다.


안녕하십니까, 간토끼입니다.

오늘은 프로그래머스(Programmers) 비밀지도 문제에 대해 다뤄보겠습니다.

2018년 카카오 블라인드 채용 코딩테스트 문제(Lv.1 수준)입니다.

 

1. 문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/17681

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

한 변의 길이가 n인 정사각형의 지도의 내용을 채우는 문제입니다.

지도의 칸공백(" ") 혹은 벽("#")으로 이루어져 있고, 이를 구하기 위해 두 개의 지도가 주어집니다.

각 지도10진수로 표현된 n개의 정수로 이루어진 배열이고, 이 10진수를 2진수로 변환해야 합니다.

예를 들어 N=5이고 숫자 9를 2진법으로 표현하면 1001이 되지만, n의 개수에 맞게 0을 더 붙여서 '01001'로 표현해야 합니다. 이때 0은 공백, 1은 벽입니다.

이렇게 지도 1, 지도 2를 변환한 후 두 가지의 규칙을 유념해서 전체 지도를 만들어줘야 하는데요.

(1) 지도 1과 지도 2 모두 1(=벽)인 칸은 벽("#")으로 나타내야 합니다.

(2) 지도 1 혹은 지도 2 중 0(=공백)인 칸은 공백(" ")으로 나타내야 합니다.

 

2. 접근 방법

다음과 같이 접근하였습니다.

전체적인 흐름은 코드를 보시면서 주석을 읽어보시면 이해가 될 거라고 생각합니다.

먼저 10진수를 2진수로 변환하기 위해 format(i, "b") 함수를 이용했습니다. ("b" : 이진수)

그리고 위에서 언급한 것처럼 주어진 수를 2진수로 표현해도 2진수의 자릿수가 n보다 작으면 안 되기 때문에,

n보다 작다면 2진수 앞에 0을 더 붙여줬습니다. 9를 예로 들면, 9는 1001이지만 n=5이기 때문에 "01001" 로 만들어주는 거죠. 이렇게 해도 결과값은 변하지 않으니깐요.

그 외 어려운 부분은 없던 문제였습니다.

구현은 문제 읽고 해석하는 게 더 어려운 것 같아요 ...

 

3. 코드

def solution(n, arr1, arr2):
    # 이진수 변환 함수 : format(i, 'b')
    total_map = [[0]*n for _ in range(n)] # nxn 지도
    map1 = [[0]*n for _ in range(n)] # map1
    map2 = [[0]*n for _ in range(n)] # map2
    
    # map1 변환
    for i in range(len(arr1)):
        bin_1 = format(arr1[i], "b") # ex. 9 -> 1001
        if len(bin_1) < n:
            diff = n - len(bin_1) # if n=5인데 bin_1 = 1001이면 01001로 만들어주기 위함
            bin_1 = diff*"0" + bin_1

        for j in range(len(bin_1)):
            map1[i][j] = bin_1[j]
            
    # map2 변환
    for i in range(len(arr2)):
        bin_2 = format(arr2[i], "b") # ex. 9 -> 1001
        if len(bin_2) < n:
            diff = n - len(bin_2) # if n=5인데 bin_1 = 1001이면 01001로 만들어주기 위함
            bin_2 = diff*"0" + bin_2
        for j in range(len(bin_2)):
            map2[i][j] = bin_2[j]
            
    # 전체 지도 병합
    # 규칙 : 하나라도 0(공백)이면 전체도 0, 둘다 1(벽)이어야만 전체도 1
    for i in range(n):
        map1_i = map1[i] # list의 i번째 list
        map2_i = map2[i] # list의 i번째 list
        
        for j in range(n):
            a = map1_i[j] # map1[i][j]
            b = map2_i[j] # map2[i][j]
            
            # 규칙 1
            if a == "1" or b == "1":
                total_map[i][j] = "#"
            elif a == "0" and b == "0":
                total_map[i][j] = " "
    
    answer = []
    for i in range(n):
        map_i = total_map[i]
        sum_i = map_i[0]
        for j in range(1, len(map_i)):
            sum_i = sum_i + map_i[j]
        answer.append(sum_i)
    
    return answer

 

감사합니다.

잘 읽으셨다면 게시글 하단에 ♡(좋아요) 눌러주시면 감사하겠습니다 :)

(구독이면 더욱 좋습니다 ^_^)

* 본 블로그는 학부생이 운영하는 블로그입니다.

따라서 포스팅에 학문적 오류가 있을 수 있으며, 이를 감안해서 봐주시면 감사하겠습니다.

 


- 간토끼(DataLabbit)

- B.A. in Economics, Data Science at University of Seoul

728x90

+ Recent posts