-
[2018 상반기 카카오 블라인드 채용 1차] 프로그래머스 카카오 비밀지도(난이도 하)Algorithm/대회 및 기타 2018. 9. 13. 14:44
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/17681
※ 추천 선행 알고리즘 : Bit 연산의 이해
문제 설명
비밀지도
네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.
- 지도는 한 변의 길이가
n
인 정사각형 배열 형태로, 각 칸은공백
(") 또는
벽(
#") 두 종류로 이루어져 있다. - 전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다. 각각
지도 1
과지도 2
라고 하자. 지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다. 지도 1과 지도 2에서 모두 공백인 부분은 전체 지도에서도 공백이다. 지도 1
과지도 2
는 각각 정수 배열로 암호화되어 있다.- 암호화된 배열은 지도의 각 가로줄에서 벽 부분을
1
, 공백 부분을0
으로 부호화했을 때 얻어지는 이진수에 해당하는 값의 배열이다.
네오가 프로도의 비상금을 손에 넣을 수 있도록, 비밀지도의 암호를 해독하는 작업을 도와줄 프로그램을 작성하라.
입력 형식
입력으로 지도의 한 변 크기
n
과 2개의 정수 배열arr1
,arr2
가 들어온다.- 1 ≦
n
≦ 16 arr1
,arr2
는 길이n
인 정수 배열로 주어진다.- 정수 배열의 각 원소
x
를 이진수로 변환했을 때의 길이는n
이하이다. 즉, 0 ≦x
≦ 2n - 1을 만족한다.
출력 형식
원래의 비밀지도를 해독하여
'#'
,공백
으로 구성된 문자열 배열로 출력하라.입출력 예제
매개변수 값 n 5 arr1 [9, 20, 28, 18, 11] arr2 [30, 1, 21, 17, 28] 출력 ["#####","# # #", "### #", "# ##", "#####"]
매개변수 값 n 6 arr1 [46, 33, 33 ,22, 31, 50] arr2 [27 ,56, 19, 14, 14, 10] 출력 ["######", "### #", "## ##", " #### ", " #####", "### # "]
Algorithm두개의 값을 OR비트 연산 후 각 비트의 자리마다 1은 '#'으로 0은 ' '으로 해당 answer String index에 저장한다.1. 두 개의 배열이 주어졌을 때 각각의 자리값마다 OR 비트 연산을 시행한다.입력 예제를 통해 예를 들면arr1의 9와 arr2의 30은 문제처럼0 1 0 0 11 1 1 1 0이므로 OR연산을 취하면 1 1 1 1 1 이 되어 answer[0]에는 "#####"이 저장되게 되는 것인데 11111값(즉, 10진수로는 31이 저장된다.)까지만 저장시킨다.
2. 이런 식으로 OR연산을 취한 값을 새로운 배열 값에 넣었다면 해당 배열의 값은 {31 21 29 19 31} 이 저장될 것이다.
이 때, 각각의 값의 각 비트의 자리 수가 1이면 '#'을, 0이면 ' '삽입하게 될텐데 비트 이동 연산을 취해 확인한다.
즉, 두번째 index의 값인 21을 비트로 바꾸면 11101인데 오른쪽으로 비트를 4개부터 0개까지 한개씩 밀어가며 비트의 값를 확인한다.
처음에 4개를 밀었을 땐, 1(10진수로는 1)
처음에 3개를 밀었을 땐, 11(10진수로는 3)
.
.
.
이런식으로 값을 띄게 될 것인데, 맨 끝의 비트가 1인지만 확인하면 되니 해당 값을 1과 AND 연산을 취해주면 알 수 있을 것이다.
3. 1~2를 모두 처리한 알고리즘을 소스코드로 보면 다음과 같다.
//kuklife.tistory.com
vector<string> solution(int n, vector<int> arr1, vector<int> arr2)
{
vector<string> answer(n);
vector<int> temp(n, 0); //bit연산 될 vector
for (int i = 0; i < n; i++) temp[i] = arr1[i] | arr2[i];
for (int i = 0; i < n; i++)
{
for (int j = n - 1; j >= 0; j--)
{
int x = temp[i] >> j;
if (x & 1) answer[i].push_back('#');
else answer[i].push_back(' ');
}
}
return answer;
}
'Algorithm > 대회 및 기타' 카테고리의 다른 글
[2018 상반기 카카오 블라인드 채용 1차] 프로그래머스 카카오 뉴스 클러스터링(난이도 중) (0) 2018.09.20 [2018 상반기 카카오 블라인드 채용 1차] 프로그래머스 카카오 프렌즈4블록(난이도 상) (0) 2018.09.19 [2018 상반기 카카오 블라인드 채용 1차] 프로그래머스 카카오 셔틀버스(난이도 중) (0) 2018.09.18 [2018 상반기 카카오 블라인드 채용 1차] 프로그래머스 카카오 캐시(난이도 하) (0) 2018.09.13 [카카오코드 2017] 프로그래머스 카카오프렌즈 컬러링북 (0) 2018.09.12 - 지도는 한 변의 길이가