정코딩
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기

  • 알고리즘/프로그래머스

    프로그래머스 점프와 순간 이동 JAVA

    2022. 5. 11.

    by. soonil

     

    코딩테스트 연습 - 점프와 순간 이동

    OO 연구소는 한 번에 K 칸을 앞으로 점프하거나, (현재까지 온 거리) x 2 에 해당하는 위치로 순간이동을 할 수 있는 특수한 기능을 가진 아이언 슈트를 개발하여 판매하고 있습니다. 이 아이언 슈

    programmers.co.kr

    문제

    해당 문제는 도착 지점이 주어졌을 때 0에서 해당 지점까지 몇의 건전지를 사용하여 갈 수 있는지 구하는 문제다.

    • 처음 위치 0 에서 5 칸을 앞으로 점프하면 바로 도착하지만, 건전지 사용량이 5 만큼 듭니다.
    • 처음 위치 0 에서 2 칸을 앞으로 점프한 다음 순간이동 하면 (현재까지 온 거리 : 2) x 2에 해당하는 위치로 이동할 수 있으므로 위치 4로 이동합니다. 이때 1 칸을 앞으로 점프하면 도착하므로 건전지 사용량이 3 만큼 듭니다.
    • 처음 위치 0 에서 1 칸을 앞으로 점프한 다음 순간이동 하면 (현재까지 온 거리 : 1) x 2에 해당하는 위치로 이동할 수 있으므로 위치 2로 이동됩니다. 이때 다시 순간이동 하면 (현재까지 온 거리 : 2) x 2 만큼 이동할 수 있으므로 위치 4로 이동합니다. 이때 1 칸을 앞으로 점프하면 도착하므로 건전지 사용량이 2 만큼 듭니다.
    조건
    • 숫자 N: 1 이상 10억 이하의 자연수
    • 숫자 K: 1 이상의 자연수
    풀이

    해당 문제는 처음에 bfs를 이용하면 되겠다 생각했다. 백준에 있는 숨바꼭질 문제와 비슷해 보였고 bfs를 이용해서 0에서부터 앞으로 나아가며 도착하면 리턴하는 식으로 문제를 해결했더니 효율성에서 모두 실패하였다. 

    더보기
    import java.util.LinkedList;
    import java.util.Queue;
    
    public class Solution {
    static int[] arr;
        public static int solution(int n) {
            arr = new int[n+1];
            for (int i = 2; i < arr.length; i++) {
    			arr[i] = Integer.MAX_VALUE;
    		}
            bfs();
            return arr[n];
        }
    	private static void bfs() {
    		Queue<Integer> q = new LinkedList<Integer>();
    		q.offer(1);
    		arr[1] = 1;
    		while(!q.isEmpty()) {
    			int n = q.poll();
    			if(n == arr.length-1) {
    				return;
    			}
    			if(n+1 < arr.length && arr[n]+1<arr[n+1]) {
    				q.add(n+1);
    				arr[n+1] = arr[n]+1;
    			}
    			if(n*2 < arr.length && arr[n]<arr[n*2]) {
    				q.add(n*2);
    				arr[n*2] = arr[n];
    			}
    		}
    	}
    }

     

     

    Baekjoon 1697 숨바꼭질 JAVA

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

    soonil.tistory.com

     

    이후 질문하기를 참고하다 보니 0에서 도착으로 접근이 아닌 도착에서 0으로 접근하라는 힌트를 얻을 수 있었고, 생각해보면 도착에서 2로 나눠지면 나누고 아니면 -1을 한 뒤 2로 나누는 방식으로 0에 도착할 수 있고 -1을 한경우에만 1씩 카운트하면 문제를 해결할 수 있다.

    코드
    public class Solution {
        public static int solution(int n) {
            int ans = 0;
        	while(n > 0) {
        		if(n % 2 == 0) {
        			n /= 2;
        		}else {
        			n = (n-1) / 2;
        			ans++;
        		}
        	}
        	return ans;
        }
    }

     

     

    GitHub - JUNGSOONIL/JAVA: JAVA 소스 코드

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

    github.com

     

    728x90

    '알고리즘 > 프로그래머스' 카테고리의 다른 글

    프로그래머스 비밀지도 JAVA  (0) 2022.05.13
    프로그래머스 배달 JAVA  (0) 2022.05.12
    프로그래머스 경주로 건설 JAVA  (0) 2022.05.10
    프로그래머스 키패드 누르기 JAVA  (0) 2022.05.09
    프로그래머스 숫자 문자열과 영단어 JAVA  (0) 2022.05.07

    댓글

    관련글

    • 프로그래머스 비밀지도 JAVA 2022.05.13
    • 프로그래머스 배달 JAVA 2022.05.12
    • 프로그래머스 경주로 건설 JAVA 2022.05.10
    • 프로그래머스 키패드 누르기 JAVA 2022.05.09
    맨 위로
전체 글 보기
  • Baekjoon
  • Solved
  • Github
Tistory 로그인
Tistory 로그아웃
로그아웃 글쓰기 관리

Today

Total

Designed by Nana
블로그 이미지
soonil

티스토리툴바