GitHub ID : soohyun-dev
윤수현의 개발 공간
GitHub ID : soohyun-dev
전체 방문자
오늘
어제
  • 분류 전체보기 (918)
    • 성장기록 (49)
      • 성장기록 (3)
      • 우아한테크코스 (16)
      • 프로젝트 (15)
      • TIL (14)
      • 테오의 스프린트 (1)
    • 프로그래밍언어 (88)
      • C언어 (14)
      • HTML\CSS (12)
      • JavaScript (7)
      • React (23)
      • Python (11)
      • JAVA (14)
      • TypeScript (6)
    • 알고리즘 공부 (736)
      • 코드업 - 파이썬 (108)
      • 백준 - 파이썬 (468)
      • 백준 - 자바스크립트 (125)
      • 프로그래머스 - 파이썬 (1)
      • 프로그래머스 - 자바스크립트 (34)
    • 책 리뷰 (9)
      • 프로그래밍 (3)
      • 독서 (6)
    • 전자기기 (1)
    • 일상, 일기 (18)
    • 기술 세미나 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 프로그래머스풀이
  • 독해
  • 영어독해
  • 백준
  • 프론트엔드
  • javascript
  • 코테
  • 백준풀이
  • 프로그래머스자바스크립트
  • 프로그래머스
  • 파이썬
  • 코드업
  • 코딩테스트
  • 프로그래밍언어
  • PYTHON
  • 영어
  • 백준파이썬
  • 자바스크립트
  • 코드업파이썬
  • 코딩

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
GitHub ID : soohyun-dev

윤수현의 개발 공간

백준/ Gold 5 문제 , 백준 Node.js 자바스크립트 9205 맥주 마시면서 걸어가기 [ BFS, 그래프 이론 ]
알고리즘 공부/백준 - 자바스크립트

백준/ Gold 5 문제 , 백준 Node.js 자바스크립트 9205 맥주 마시면서 걸어가기 [ BFS, 그래프 이론 ]

2023. 4. 11. 14:51

백준/ Gold 5 문제 , 백준 Node.js 자바스크립트 9205 맥주 마시면서 걸어가기 [ BFS, 그래프 이론 ]

 

 

✔️Check Point !   ( 해당사항 ✓체크 )

1. 막힘 없이 수월하게 풀린 문제인가?

2. 1시간이내로 풀렸던 문제인가?

3. 1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?

4. 시간을 써도 도무지 풀 수 없는 문제인가?

5. 솔루션을 찾아봤는가?

-------------------------------------------------------------------------------------------

난이도 체감 🧑‍💻
1. 최상
2. 상
3. 중
4. 하


이해도 🙆‍♂️
1. 완벽히 이해
2. 다소 헷갈리는 부분들이 있음
3. 이해 못함

 

🏡 문제출처 

 

https://www.acmicpc.net/problem/9205

 

9205번: 맥주 마시면서 걸어가기

송도에 사는 상근이와 친구들은 송도에서 열리는 펜타포트 락 페스티벌에 가려고 한다. 올해는 맥주를 마시면서 걸어가기로 했다. 출발은 상근이네 집에서 하고, 맥주 한 박스를 들고 출발한다.

www.acmicpc.net

 

 

 

🏡 풀이소감

접근방식에서는 크게 틀린 것이 없었는데 계속 3%에서 틀리는 것이다.

 

TC 도 다운받아서 다 확인해봐도 틀린 곳이 없는데 시작부터 틀린다는 것은 알고리즘에서의 문제보단 입력 처리에서 문제가 생겼을 확률이 컸다.

 

똑같은 로직을 가져가면서 처리를 좀 다르게 해주니 통과가 되었다.

 

문제 난이도와는 별개로 애를 먹었던 문제.

 

 

깊은 복사를했던것이 문제였다. 

 

깊은 복사를 제외하고 다시풀어보니 재귀로도 풀렸음.

 

두가지 방법을 다 첨부하겠습니다.

 

 

📝 해결전략

 

 

풀이법은 특별한 것 없이 너비우선탐색으로 접근해주었다.

 

큐에다가 시작 위치를 넣어주고 편의점의 위치를 순회한다.

 

만약 거리가 1000이내이면 움직일 수 있는 거리이므로 이동시킨뒤 해당위치를 큐에 넣어준다.

 

이런식으로 계속 돌면서 종착지까지 도착을 하는 경우가 단 한 번이라도 존재한다면, check 변수에 true를 할당하여

 

해당 테스트는 도착을 할 수 있는 경우라고 표시해주면 된다.

 

 

 

1) 큐 사용

 

 

const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
const log = console.log;

const T = +input[0];
let idx = 1;

for (let i = 0; i < T; i++) {
  const bfs = (X, Y) => {
    const deque = [[X, Y]];
    while (deque.length) {
      const [x, y] = deque[0];
      deque.shift();
      if (Math.abs(x - festival[0]) + Math.abs(y - festival[1]) <= 1000) {
        check = true;
        return;
      }
      for (let k = 0; k < N; k++) {
        if (!visited[k]) {
          if (Math.abs(x - place[k][0]) + Math.abs(y - place[k][1]) <= 1000) {
            visited[k] = true;
            deque.push([place[k][0], place[k][1]]);
          }
        }
      }
    }
    return;
  };

  const N = +input[idx];
  idx += 1;
  const visited = Array.from({ length: N }).fill(false);
  const start = input[idx].split(' ').map(Number);
  let place = [];
  let check = false;
  for (let j = 1; j <= N; j++) {
    place.push(input[idx + j].split(' ').map(Number));
  }
  idx += N + 1;
  const festival = input[idx].split(' ').map(Number);
  idx += 1;

  bfs(...start);

  log(check ? 'happy' : 'sad');
}

 

2) 재귀 방식

 

 

const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
const log = console.log;

const T = +input[0];
let idx = 1;

for (let i = 0; i < T; i++) {
  const bfs = (x, y, Visited) => {
    if (Math.abs(x - festival[0]) + Math.abs(y - festival[1]) <= 1000) {
      check = true;
      return;
    }

    for (let k = 0; k < N; k++) {
      if (check) return;
      if (!Visited[k]) {
        if (Math.abs(x - place[k][0]) + Math.abs(y - place[k][1]) <= 1000) {
          Visited[k] = true;
          bfs(place[k][0], place[k][1],Visited);
        }
      }
    }
  };

  const N = +input[idx];
  idx += 1;
  const visited = Array.from({ length: N }).fill(false);
  const start = input[idx].split(' ').map(Number);
  let place = [];
  let check = false;
  for (let j = 1; j <= N; j++) {
    place.push(input[idx + j].split(' ').map(Number));
  }
  idx += N + 1;
  const festival = input[idx].split(' ').map(Number);
  idx += 1;

  bfs(...start, visited);

  log(check ? 'happy' : 'sad');
}

 

 

반응형

'알고리즘 공부 > 백준 - 자바스크립트' 카테고리의 다른 글

백준/ Gold 2 문제 , 백준 Node.js 자바스크립트 17822 원판 돌리기 [ 구현, 시뮬레이션 ]  (0) 2023.02.14
백준/ Gold 2 문제 , 백준 Node.js 자바스크립트 12100 2048 (Easy) [ 백트래킹, DFS, 구현 ] 삼성 SW 역량 테스트 기출 문제  (0) 2022.12.14
백준/ Silver 2 문제 , 백준 Node.js 자바스크립트 11568 민균이의 계략 [ 이분탐색, LIS ]  (0) 2022.12.14
백준/ Gold 4 문제 , 백준 Node.js 자바스크립트 1806 부분합  (0) 2022.12.12
백준/ Gold 2 문제 , 백준 Node.js 자바스크립트 3066 브리징 시그널 [ 이분탐색, LIS ]  (0) 2022.12.12
    '알고리즘 공부/백준 - 자바스크립트' 카테고리의 다른 글
    • 백준/ Gold 2 문제 , 백준 Node.js 자바스크립트 17822 원판 돌리기 [ 구현, 시뮬레이션 ]
    • 백준/ Gold 2 문제 , 백준 Node.js 자바스크립트 12100 2048 (Easy) [ 백트래킹, DFS, 구현 ] 삼성 SW 역량 테스트 기출 문제
    • 백준/ Silver 2 문제 , 백준 Node.js 자바스크립트 11568 민균이의 계략 [ 이분탐색, LIS ]
    • 백준/ Gold 4 문제 , 백준 Node.js 자바스크립트 1806 부분합
    GitHub ID : soohyun-dev
    GitHub ID : soohyun-dev
    환영합니다!😊 이곳은 저의 개발에 관한 내용들을 정리하는 공간입니다. 알고리즘 풀이에도 관심이 많아요. 좋은 하루 되세요~! github : soohyun_dev

    티스토리툴바