프라이D
프라이Develog(❁´◡`❁)
프라이D
전체 방문자
오늘
어제
  • ALL (378)
    • TDD, Cleancode with JavaScr.. (5)
    • 프로젝트 (32)
      • work (3)
      • 직접 만드는 기술 블로그 (2)
      • 데일리 옥션 (19)
      • 모락모락 (8)
    • Computer Science (1)
    • Algorithm & 자료구조 (94)
      • 알고리즘 w.JavaScript (53)
      • 자료구조 (5)
      • (인프런) 자바스크립트 알고리즘 문제풀이 (34)
    • JavaScript (45)
      • JavaScript (41)
      • 모던 자바스크립트 Deep Dive (4)
    • WEB (13)
    • 회고 (12)
    • TIL (109)
    • WIL (7)
    • Stacks (20)
      • React.js (6)
      • Next.js (1)
      • Redux (3)
      • Node.js (2)
      • GIT (2)
      • SAP (1)
    • 15일 메이킹 프로젝트 (15)
    • 이전 기록 (14)
    • ETC. (5)
    • ---------------2021 (6)
      • 내일배움단-웹개발 5주 (2)
      • 정보처리기사 (4)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • 내일배움단
  • MySQL
  • 코딩프로젝트
  • vanilaJS
  • 알고리즘
  • 스파르타코딩클럽
  • nomadcoder
  • 자바스크립트비트마스크
  • 2023 인프콘 후기
  • 내일배움카드
  • nomadcoders
  • Til
  • 투포인터알고리즘
  • 국비지원
  • JavaScript
  • 비트마스크
  • 코드스테이츠
  • 모던자바스크립트딥다이브
  • 자바스크립트
  • 자바스크립트알고리즘

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
프라이D

프라이Develog(❁´◡`❁)

Algorithm & 자료구조/알고리즘 w.JavaScript

[알고리즘] 백준 2292번: 벌집 W_node.js

2022. 6. 2. 18:48

문제

 

2292번: 벌집

위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌

www.acmicpc.net

풀이

const readFileSyncAddress = '/dev/stdin';

const fs = require('fs');
let [N] = fs
  .readFileSync(readFileSyncAddress)
  .toString()
  .trim()
  .split(' ')
  .map((v) => +v);

const solution = function (n) {
  let i = 1;
  let range = 1;

  // n이 범위를 넘어가면 도달한 것.
  while (range < n) {
    //range : 해당 회차까지 접근가능한 수의 범위, 이전 수 + 6의 배수.
    range += 6 * i;
    //n이 range까지 도달하기 위한 횟수
    i++;
  }
  return i;
};

console.log(solution(N));

풀이과정

  • 이번 문제는 너무 어려워서 다른 답안들을 참고했다. 기존에 틀린 답안은 아래와 같다.
const solution = function (n) {
  if (n === 1) return 1;
  if (n >= 1 && n <= 6) return 2;
  
  let k = 1;
  let j = 2;
  let f = k;
  for (let i = 1; i < n; i++) {
    if (n >= 6 * f && n <= 6 * k) return i + 1;
    f = k;
    k += j;
    j++;
  }
};

console.log(solution(N));
  • 처음에 접근할 수 있는 수의 범위가 회차에 따라 6*1, 6*3, 6*6 ... 와 같이 증가한다는 것을 발견했다.
    그래서 입력된 숫자인 n이 어느 범위에 위치하는지 알면, 그에 맞는 답안을 도출할 수 있을거라는 생각으로 접근했다.
    문제는 회차에 따라 6 * k 에서 k의 값이 달라지고, 이에 따른 모든 범위를 다 체크할 수 없다는 점이었다. 
    따라서 이전 k 값을 저장할 변수 f와, 계속 증가하는 k 값을 업데이트할 변수 j를 추가했다. 
  • 그런데 위 답안에서는 n의 크기에 따라서 답안이 기대와 다르게 (1이 작던지, 1이 크던지) 도출되었다.
    추측으로는 범위를 체크하는 부분에서 잘못된 것 같은데, 해당 범위를 파악하기 위해서 선언한 변수가 많아지니 복잡해져서 이를 줄이기 위해 고민하다가 다른 풀이를 참고했다. 
  • 다른 풀이에서는 회차별로 접근할 수 있는 숫자의 합을 누적하고, 이 범위를 넘어갈 때 까지 카운트를 해서 이 카운트를 리턴하는 방식으로 푸는 것 같다. 내 풀이방식에서는 n이 정확히 어디에 위치하는지 알야아 한다는 강박때문에 이것을 계속 추적하려고 해서 점점 더 복잡해진 것 같다. 그냥 몇 번 만에 지정된 범위를 넘어서는지가 문제의 핵심이었는데... 핵심에 가까워지는 노력이 필요할 것 같다. 
저작자표시 (새창열림)

'Algorithm & 자료구조 > 알고리즘 w.JavaScript' 카테고리의 다른 글

[알고리즘]백준 2869번: 달팽이는 올라가고 싶다 W_node.js  (0) 2022.06.08
[알고리즘]백준 1193번: 분수찾기 W_node.js  (0) 2022.06.08
[알고리즘] 백준 1712번: 손익분기점 W_node.js  (0) 2022.05.20
[알고리즘] 백준 1316번: 그룹 단어 체커 W_node.js  (0) 2022.05.11
[알고리즘] 백준 2941번: 크로아티아 알파벳 W_node.js  (0) 2022.05.11
    'Algorithm & 자료구조/알고리즘 w.JavaScript' 카테고리의 다른 글
    • [알고리즘]백준 2869번: 달팽이는 올라가고 싶다 W_node.js
    • [알고리즘]백준 1193번: 분수찾기 W_node.js
    • [알고리즘] 백준 1712번: 손익분기점 W_node.js
    • [알고리즘] 백준 1316번: 그룹 단어 체커 W_node.js
    프라이D
    프라이D
    틀린내용 정정 및 개선사항은 언제든지 댓글 달아주세요 :D

    티스토리툴바