본문 바로가기

항해99_10기/[2주차] 알고리즘 문제풀이

[35번] [상] [1차] 비밀지도

 

프로그래머스

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

programmers.co.kr

 

이 문제는 꽤나 재미있게 풀었다.

퍼즐 푸는 것 같아서 재미있었던 문제!

 

 

나의 풀이

 * 35.비밀지도
 *정수 배열의 각 원소 x를 이진수로 변환했을 때의 길이는 n 이하이다. 즉, 0 ≦ x ≦ 2n - 1을 만족한다.

 

[pseudo code]

1. 0 ~ n 사이를 도는 루프 생성

  •  arr1과 arr2를 각각 a1, a2 배열로 받는데, 이때 각 원소를 2진법으로 변환한 뒤, 한자리씩 string으로 만들어 배열에 넣어주고, 그 배열을 뒤집기 
  •  a1과 a2.의 길이가 n이 될때까지 "0"을 푸쉬
    • (arr1[0] = 9 -> 2진수로 변환(1001) / arr1[0] => 11110 / 각 숫자를 2진수로 변환했을 때, 자릿수를 맞춰주기 위해서, 배열에 넣어 뒤집고, push로 0을 채워 줌)
  • 빈 배열 temp를 생성하고, j를 도는 루프를 생성
    • sum = a1과 a2의 각 자릿수를 더해줌 (a1과 a2의 요소는 string이므로, 숫자로 변환해서 더해줘야 함)
    • 만약 sum > =1이면, 벽이므로, temp에 "#"을 푸쉬
    • 아닌경우, " "(공백)을 푸쉬

2. j 루프를 탈출해서 temp 배열을 합치고, 해당 값을 answer에 푸쉬

3. answer 값 반환

 

function solution(n, arr1, arr2) {
  let answer = [];
  for (let i = 0; i < n; i++) {
    let a1 = [...arr1[i].toString(2)].reverse();
    let a2 = [...arr2[i].toString(2)].reverse();
    while (a1.length < n) a1.push("0");
    while (a2.length < n) a2.push("0");

    let temp = [];
    for (let j = n - 1; j >= 0; j--) {
      let sum = +a1[j] + +a2[j];
      if (sum >= 1) temp.push("#");
      else temp.push(" ");
    }
    answer.push(temp.join(""));
  }
  return answer;
}

console.log(solution(5, [9, 20, 28, 18, 11], [30, 1, 21, 17, 28]));
// ["#####","# # #", "### #", "# ##", "#####"]
console.log(solution(6, [46, 33, 33, 22, 31, 50], [27, 56, 19, 14, 14, 10]));
// 	["######", "### #", "## ##", " #### ", " #####", "### # "]