정코딩
Home
  • 분류 전체보기 (421)
    • 알고리즘 (382)
      • Baekjoon (301)
      • SW Academy (39)
      • JUNGOL (7)
      • 프로그래머스 (33)
    • CS (4)
      • 알고리즘 (1)
    • 공부 (19)
      • JAVA (6)
      • BackEnd (4)
      • FrontEnd (3)
      • 프로젝트 (6)
    • 일상 (16)
      • 기타 (16)
Home
  • 분류 전체보기 (421)
    • 알고리즘 (382)
      • Baekjoon (301)
      • SW Academy (39)
      • JUNGOL (7)
      • 프로그래머스 (33)
    • CS (4)
      • 알고리즘 (1)
    • 공부 (19)
      • JAVA (6)
      • BackEnd (4)
      • FrontEnd (3)
      • 프로젝트 (6)
    • 일상 (16)
      • 기타 (16)
블로그 내 검색
Portfolio

정코딩

동의대학교 컴퓨터공학과 SSAFY 6기

  • 알고리즘/Baekjoon

    Baekjoon 12851 숨바꼭질 2 JAVA

    2022. 3. 8.

    by. soonil

     

    12851번: 숨바꼭질 2

    수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때

    www.acmicpc.net

    문제

    해당 문제는 수빈이와 동생의 위치가 주어졌을 때 수빈이가 몇 초 만에 동생 위치로 갈 수 있는지와 가는 같은 시간 내 갈 수 있는 경우의 수를 구하는 문제다.

    조건

    수빈이는 1초 후 x-1 또는 x+1로 또는 2*x로 이동 가능하다.

    최대 100000까지 이동 가능하다.

    풀이

    해당 문제는 bfs를 이용해서 해결했다. 예전과 다르다면 이제 큐에 데이터 형식을 class를 하나 두어서 좌표와 이동 횟수를 넣는 식으로 진행했고, bfs를 돌리는 과정에서 조건을 통해서 이동 횟수를 저장하고, 이후 저장된 이동 횟수와 현재 이동 횟수를 비교하는 방법으로 총 이동 횟수를 저장했고, 저장된 이동 횟수와 큐에서 빼낸 이동 횟수가 더 크면 멈추는 식으로 로직을 구현했다.

    처음 방문 체크를 하고 문제를 해결하니 테케에서 체크가 되지 않아서 방문 체크를 하지 않고 문제를 해결하고 제출을 했지만 메모리 초과가 발생했고, 이후 생각을 하던 중 큐에 넣을 때마다 방문 체크를 하는 게 아니라 큐에서 빼낼 때 방문 체크하는 방식으로 문제를 해결했다.

    코드
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.StringTokenizer;
    
    public class Main {
    
    	static int N, K, answer_time, answer_cnt;
    	static boolean[] visit;
    	static Queue<Node> q = new LinkedList<>();
    	public static void main(String[] args) throws Exception{
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		StringTokenizer st = new StringTokenizer(br.readLine());
    		N = Integer.parseInt(st.nextToken());
    		K = Integer.parseInt(st.nextToken());
    		visit = new boolean[100001]; // K보다 멀리갔다가 돌아오는 경우도있으므로 100001으로 지정
    		q.offer(new Node(N,0)); // 시작 좌표와 이동횟수를 처음 넣어줌.
    		bfs();
    		System.out.println(answer_time);
    		System.out.println(answer_cnt);
    	}
    	
    	private static void bfs() {
    		while(!q.isEmpty()) {
    			Node n = q.poll();
    			if(answer_time == 0 && n.index == K) //이동 횟수 갱신 안됬고, 동생에게 도착했으면 이동 횟수 갱신
    				answer_time = n.cnt;
    			if(n.index == K && answer_time == n.cnt) // 동생에게 도착했고, 갱신된 이동 횟수와 이동 횟수가 같으면 카운트 증가
    				answer_cnt++;
    			if(answer_time != 0 && answer_time < n.cnt)// 이동 횟수가 갱신되었고, 현재 큐에서 빼낸 이동횟수가 갱신값보다 크면 종료
    				return;
    			visit[n.index] = true; // 큐에 넣을때 방문 체크를 하지않고 여기서해줌 => 큐에서 넣으면서 체크하면 다른 경로로 가야하는 값이 이미 방문처리로 못가도록 되므로
    			int sub = n.index - 1;
    			int add = n.index + 1;
    			int mul = n.index * 2;
    			if(sub >= 0 && !visit[sub]) {
    				q.offer(new Node(sub, n.cnt + 1));
    			}
    			if(add <= 100000 && !visit[add]) {
    				q.offer(new Node(add, n.cnt + 1));
    			}
    			if(mul <= 100000 && !visit[mul]) {
    				q.offer(new Node(mul, n.cnt + 1));
    			}
    		}
    	}
    	
    	static class Node{
    		int index, cnt;
    		Node(int index, int cnt){
    			this.index = index;
    			this.cnt = cnt;
    		}
    	}
    }

     

     

    GitHub - JUNGSOONIL/JAVA: JAVA 소스 코드

    JAVA 소스 코드. Contribute to JUNGSOONIL/JAVA development by creating an account on GitHub.

    github.com

    참고

    해당 문제는 아래의 숨바꼭질 문제와 연관된 문제다.

     

    Baekjoon 1697 숨바꼭질 JAVA

    https://www.acmicpc.net/problem/1697 1697번: 숨바꼭질 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순..

    soonil.tistory.com

     

     

    Baekjoon 13549 숨바꼭질 3 JAVA

    https://www.acmicpc.net/problem/13549 13549번: 숨바꼭질 3 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거..

    soonil.tistory.com

     

    728x90

    '알고리즘 > Baekjoon' 카테고리의 다른 글

    Baekjoon 11967 불켜기 JAVA  (0) 2022.05.15
    Baekjoon 1303 전쟁 - 전투 JAVA  (0) 2022.05.14
    Baekjoon 11060 점프 점프 JAVA  (0) 2022.03.05
    Baekjoon 3184 양 JAVA  (0) 2022.01.17
    Baekjoon 8911 거북이 JAVA  (0) 2022.01.16

    댓글

    관련글

    • Baekjoon 11967 불켜기 JAVA 2022.05.15
    • Baekjoon 1303 전쟁 - 전투 JAVA 2022.05.14
    • Baekjoon 11060 점프 점프 JAVA 2022.03.05
    • Baekjoon 3184 양 JAVA 2022.01.17
    맨 위로
전체 글 보기
  • Baekjoon
  • Solved
  • Github
Tistory 로그인
Tistory 로그아웃
로그아웃 글쓰기 관리

Today

Total

Designed by Nana
블로그 이미지
soonil

티스토리툴바