[백준] 16953 A → B(Silver.2) - BFS

2024. 8. 6. 20:50·코딩 테스트/알고리즘

문제

A → B

코드


DFS나 Greedy로 풀 수 있지만 BFS를 공부중이기 때문에 BFS 방식으로 풀었다.
이 문제는 인접 행렬이나 인접 리스트를 구현할 필요가 없기 때문에 큐와 방문 여부 체크만 체크하여 풀었다.

  • 풀이 방법
  1. 노드의 값과 level을 저장할 큐를 선언하여 초기 값을 저장한다.
Queue<long[]> queue = new LinkedList<>();
        queue.offer(new long[] {A, 1});
  1. 큐에서 값을 빼고 현재 값 * 2, 현재 값 + "1"을 구한다.
long[] current = queue.poll();
            long cvalue = current[0];
            long clevel = current[1];
            long two = cvalue * 2;
            long one = Long.parseLong(Long.toString(cvalue) + "1");
  1. 2에서 구한 값 중 B와 같은 값이 있다면 값의 level을 반환하고 2에서 구한 값이 B보다 작다면 큐에 값과 level을 추가한 후 2번을 반복한다.
while (!queue.isEmpty()) {
            long[] current = queue.poll();
            long cvalue = current[0];
            long clevel = current[1];
            long two = cvalue * 2;
            long one = Long.parseLong(Long.toString(cvalue) + "1");
            if (two == B || one == B) {
                level = clevel + 1;
                break;
            }
            if (two < B) {
                queue.offer(new long[] {two, clevel+1});
            }
            if (one < B) {
                queue.offer(new long[] {one, clevel+1});
            }
        }

전체 코드

  • 방문 여부를 체크하기 위해 HashSet을 사용하였는데 이 문제에서는 방문 여부를 체크하지 않아도 괜찮다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class _16953 {
    public static void main(String [] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int result = -1;

        String[] input = br.readLine().split(" ");
        int A = Integer.parseInt(input[0]);
        int B = Integer.parseInt(input[1]);

        System.out.println(BFS(A, B));

    }

    public static long BFS(int A, int B) {
        Queue<long[]> queue = new LinkedList<>();
        queue.offer(new long[] {A, 1});

        HashSet<Long> visited = new HashSet<>();
        visited.add((long) A);

        // int로 선언시 int 범위를 넘어가 런타임 에러 (NumberFormat) 발생하여 long으로 선언.
        long level = -1;

        while (!queue.isEmpty()) {
            long[] current = queue.poll();
            long cvalue = current[0];
            long clevel = current[1];
            long two = cvalue * 2;
            long one = Long.parseLong(Long.toString(cvalue) + "1");
            if (two == B || one == B) {
                level = clevel + 1;
                break;
            }
            if (two < B && !visited.contains(two)) {
                queue.offer(new long[] {two, clevel+1});
                visited.add(two);
            }
            if (one < B && !visited.contains(one)) {
                queue.offer(new long[] {one, clevel+1});
                visited.add(one);
            }
        }
        return level;
    }
}

'코딩 테스트 > 알고리즘' 카테고리의 다른 글

[프로그래머스] 43165 타겟넘버(Lv.2) - DFS, BFS  (0) 2024.08.07
[백준] 13549 숨바꼭질 3(Gold.5) - BFS  (0) 2024.08.06
[백준] 1743 음식물 피하기(Silver.1) - BFS  (0) 2024.08.06
[백준] 1303 전쟁 - 전투(Silver.1) - BFS  (0) 2024.08.06
[백준] 11047 동전 0 - 그리디(Greedy)  (0) 2024.08.01
'코딩 테스트/알고리즘' 카테고리의 다른 글
  • [프로그래머스] 43165 타겟넘버(Lv.2) - DFS, BFS
  • [백준] 13549 숨바꼭질 3(Gold.5) - BFS
  • [백준] 1743 음식물 피하기(Silver.1) - BFS
  • [백준] 1303 전쟁 - 전투(Silver.1) - BFS
토자맨
토자맨
  • 토자맨
    개발하는 토자맨
    토자맨
  • 전체
    오늘
    어제
    • 개발 공부
      • 코딩 테스트
        • 코드업 기초 100제
        • 백준
        • 99클럽
        • 자료구조
        • 알고리즘
      • Programming Language
        • 자바(JAVA)
      • Back-end
        • Spring
      • Front-end
        • html
        • css
      • DevOps
        • AWS
        • CI CD
        • Docker
        • 홈서버
        • Git
      • Computer Science
        • 자료구조
        • 알고리즘
        • 운영체제
        • OS,Network,DB,DesignPattern
      • 프로젝트
        • 웨이트 쇼핑몰
      • 공부 로드맵
        • 2학년 겨울방학
        • 3학년 2학기
        • 3학년 겨울방학
      • 일상
        • 기타 정보
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준 #이진탐색 #이분탐색
    99클럽 #코딩테스트 준비 #개발자 취업 #항해99 #til
    dfs #백준
    git filter-branch #commit 수정 #commit
    이진탐색 #이분탐색 #알고리즘
    백준 #dp #동적계획법
    bfs #백준
    백준 #bfs
    싱글톤 패턴 #싱글톤 컨테이너 #싱글톤 레지스트리 #싱글톤 객체 상태 #무상태 #stateless #유지상태 #staleful
    ec2 멈춤 #ec2 터짐 #ec2 ssh 연결 끊김 #ec2 끊김
    bfs #프로그래머스
    nvidia container toolkit #
    스프링 #spring #스프링 컨테이너 #스프링 컨텍스트
    티스토리챌린지
    dfs #알고리즘
    백준 #dfs
    피보나치 수 #백준 #dp
    프로그래머스 #dfs
    nvidia-docker #docker cuda #docker gpu #엔비디아 도커
    이진탐색 #이분탐색 #백준
    solid #객체지향설계원칙
    스프링핵심원리 #김영한 #의존관계자동주입 #의존관계 자동 주입
    백준 #dfs #알고리즘
    백준 #dfs #11725번
    git filter-repo
    프로그래머스 #dp
    오블완
    dp #백준 #동적계획법
    bfs #최단거리탐색 #프로그래머스
    백준 #아기상어2 #bfs
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
토자맨
[백준] 16953 A → B(Silver.2) - BFS
상단으로

티스토리툴바