당근먹는하니
귀엽고 행복해
당근먹는하니
전체 방문자
오늘
어제
  • 분류 전체보기 (274)
    • 다람쥐🐿 (26)
    • C++ 공부빵야 (7)
    • 공부👻 (5)
    • 프론트엔드✏️ (228)
      • 코드캠프 (120)
      • 팀 프로젝트✨ (31)
      • 개인공부 (67)
    • 프론트엔드 - 바닐라js (7)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • CSS
  • 팀플
  • 코딩
  • 팀프로젝트
  • 리액트
  • next.js
  • 부트캠프
  • 코드캠프
  • 배포
  • JS
  • 배열
  • 자바스크립트
  • react
  • typescript
  • emotion
  • 알고리즘
  • 팀 프로젝트
  • 회고
  • refreshtoken
  • 프로그래머스
  • algorithm
  • ssg
  • 공통 컴포넌트
  • HTML
  • React-hook-form
  • javascrpit
  • graphql
  • 프론트엔드
  • 코딩 부트캠프
  • javascript

최근 댓글

최근 글

티스토리

250x250
반응형
hELLO · Designed By 정상우.
당근먹는하니

귀엽고 행복해

알고리즘 - [1차] 비밀지도
프론트엔드✏️/코드캠프

알고리즘 - [1차] 비밀지도

2022. 6. 27. 10:58
728x90
반응형

2018 KAKAO BLIND RECRUITMENT

 

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

 

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

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

programmers.co.kr

네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.

  1. 지도는 한 변의 길이가 n인 정사각형 배열 형태로, 각 칸은 "공백"(" ") 또는 "벽"("#") 두 종류로 이루어져 있다.
  2. 전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다. 각각 "지도 1"과 "지도 2"라고 하자. 지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다.
    지도 1과 지도 2에서 모두 공백인 부분은 전체 지도에서도 공백이다.
  3. "지도 1"과 "지도 2"는 각각 정수 배열로 암호화되어 있다.
  4. 암호화된 배열은 지도의 각 가로줄에서 벽 부분을 1, 공백 부분을 0으로 부호화했을 때 얻어지는 이진수에 해당하는 값의 배열이다.


function solution(n, arr1, arr2) {
  let array1 = [];
  let array2 = [];
  let array3 = [];
  console.log(array1)
  for(let i = 0; i < n; ++i) {
    array1.push(arr1[i].toString(2).padStart(n,"0"))
  	array2.push(arr2[i].toString(2).padStart(n,"0"))
  }
  console.log(array1, array2)
  
  let temp = "";
  for(let i = 0; i < n; ++i) {
    for(let j = 0; j < n; ++j) {
      if(array1[i][j]==="0"&&array2[i][j]==="0") {
        temp += " ";
      } else temp += "#"
    }
    array3.push(temp);
    temp = "";
  }
  console.log(array3)
    return array3;
}

solution(5, [9, 20, 28, 18, 11], [30, 1, 21, 17, 28])

처음 문제 보고 뭐야,,, 싶었는데 처음 떠올린 해결 방안으로 한 번에 풀었다!

아직 쉬운 문제겠지만... 그래도 예전에 완전 기초 문제도 못 풀던 거 생각하면 완전 뿌듯하다 🫶

아직 메서드로 푸는 방법은 생각도... 안 나지만 지금 너무 뿌듯해! 

 

1. 받은 지도 두 개를 2진수로 풀어낸다. 자리수에 못 미치면 그 부분은 padStart를 이용해 "0"으로 메꾼다.

2. 풀어낸 지도를 새 배열에 push로 담는다. 여기선 new Array를 해서 그 자리에 굳이 넣어줄 필요없이 순서대로 들어가기만 하면 돼서 push로 담았다.

3. 배열의 한 줄, 그리고 그 안에 문자열 하나하나에 접근해야해서 이중포문을 사용했다. array1과 array2의 한 줄의 한 글자씩 가져와서 둘 다 0이면 벽이 아니기에 " "를 더해주고, 그게 아닌 모든 경우의 수는 벽이기 때문에 "#"을 더해준다. 

  * 여기서 push가 아닌 이유는 array1, array2의 형태(문자열이 5개 들어가있는 형태)처럼 만들기 위해서다. 정확히는 반환해야 하는 형식에 맞추기 위해서 문자열안에 더해주고,  한 줄이 완성 될때마다 그 문자열을 push하는 형식으로 했다. 

4. 그럼 완성된 array3을  return 해주면 된다~~~!

return하는 모습

 

멘토님 메서드 이용한 풀이법! 

function solution(n, arr1, arr2) {
	return arr1.map((map1, i)=> {
    // console.log(map1, arr2[i])
    map1 = map1.toString(2).padStart(n, "0");
    const map2 = arr2[i].toString(2).padStart(n, "0");
    
    return map1.split("").reduce((acc,cur, j)=> {
      // console.log(acc, cur, map1, map2[j])
      return acc + (cur === "1" || map2[j]==="1" ? "#" : " ")
    },"")
    // 문자열 쪼개서 배열로 만들기
    // 리듀스의 결과를 배열로 묶어서 리턴한다. 
    // 와 신기하당
    console.log(map1, map2);
  })
  
  // 크기가 같아서 인덱스 값을 공유할 수 있다. 
}

solution(5, [9, 20, 28, 18, 11], [30, 1, 21, 17, 28])

reduce안에서 (acc,cur) => acc+cur 은 화살표 함수 + 한 줄 일 때 return을 생략할 수 있기 때문에 저렇게 쓸 수 있는 것이고, { } 중괄호를 쓰면 return을 명시적으로 써줘야 한다. 

acc(누적값)에 cur을 더하고 다음 반복문으로 넘기고...를 반복하는데 여기서 return이 없으면 acc가 undefined로 나온다! 

 

map이랑 reduce 안에서 저렇게 많은 일이 일어나도 되는건가? 싶어서 볼때마다 신기하다... 나도 언젠가 메서드로 풀 수 있길,,,! 

728x90
반응형
저작자표시 비영리 동일조건 (새창열림)

'프론트엔드✏️ > 코드캠프' 카테고리의 다른 글

SPA(Single Page Application) & MPA(Multi Page Application)  (0) 2022.06.28
220627 프론트엔드 부트캠프 48일차 : 배포를 해보자!(1), 테스트 코드(jest), 리액트 네이티브  (0) 2022.06.27
220624 프론트엔드 부트캠프 45일차 🌺기말고사🌺 파이팅🫶  (0) 2022.06.24
220623 프론트엔드 부트캠프 44일차 : optimistic ui, og, SSR  (0) 2022.06.23
[문제...] react-hook-form, 엔터치면 뮤테이션이 날아감  (0) 2022.06.23
    '프론트엔드✏️/코드캠프' 카테고리의 다른 글
    • SPA(Single Page Application) & MPA(Multi Page Application)
    • 220627 프론트엔드 부트캠프 48일차 : 배포를 해보자!(1), 테스트 코드(jest), 리액트 네이티브
    • 220624 프론트엔드 부트캠프 45일차 🌺기말고사🌺 파이팅🫶
    • 220623 프론트엔드 부트캠프 44일차 : optimistic ui, og, SSR
    당근먹는하니
    당근먹는하니

    티스토리툴바