• 티스토리 홈
  • 프로필사진
    유니얼
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
유니얼
  • 프로필사진
    유니얼
    • 분류 전체보기 (295)
      • Unity (17)
        • 게임 개발 (5)
      • Unreal (24)
        • 게임 개발 (20)
      • DirectX (36)
      • 코딩테스트 (91)
        • 프로그래머스 (25)
        • 백준 (66)
      • Google Workspace (1)
      • Programing (102)
        • C# (68)
        • C++ (24)
        • JavaScript (10)
      • 게임 서버 프로그래밍 (17)
      • Web (6)
        • 슈퍼코딩 (6)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
    등록된 댓글이 없습니다.
  • 최근 공지
    등록된 공지가 없습니다.
# Home
# 공지사항
#
# 태그
# 검색결과
# 방명록
  • [프로그래머스] 점프와 순간 이동(C++)
    2024년 01월 18일
    • 유니얼
    • 작성자
    • 2024.01.18.:30
    728x90

    안녕하세요! 오늘은 코딩테스트 문제 중 하나인 "점프와 순간 이동" 문제를 해결하는 방법에 대해 설명하려고 합니다. 이 문제에서는 아이언 슈트를 착용한 사용자가 거리 N만큼 이동하려고 할 때 필요한 최소한의 건전지 사용량을 구하는 것이 목적입니다. 문제를 해결하는 과정과 코드를 자세히 알아보겠습니다.

    문제링크 : 

    https://school.programmers.co.kr/learn/courses/30/lessons/12980

     

    프로그래머스

    코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

    programmers.co.kr

    Question_1
    Question_2

    문제 개요

    "점프와 순간 이동" 문제에서는 아이언 슈트를 착용한 사용자가 거리 N만큼 이동하려고 할 때 필요한 최소한의 건전지 사용량을 구하는 것이 목적입니다. 아이언 슈트는 한 번에 K 칸을 점프할 수 있으며, 순간이동을 하면 현재까지 온 거리의 두 배로 이동할 수 있습니다. 점프는 건전지를 소모하지만, 순간이동은 건전지 소모가 없습니다.

    문제 해결 전략

    이 문제를 해결하기 위한 핵심 전략은 점프를 최소화하고 순간이동을 최대화하는 것입니다. 건전지 사용량을 줄이기 위해선 목적지에 도달하기 위해 필요한 점프 횟수를 최소로 줄여야 합니다.

    구현 단계:

    1. 목적지에서 시작하기: 목적지에서 시작하여 출발점으로 거슬러 올라가는 방식으로 문제를 접근합니다.
    2. 순간이동의 효율적 사용: 현재 위치가 짝수이면 순간이동을 합니다. 순간이동은 현재 위치를 2로 나누는 것과 같습니다.
    3. 점프의 최소화: 현재 위치가 홀수일 때만 점프를 사용합니다. 점프는 건전지 사용량을 1만큼 증가시킵니다.
    4. 반복 실행: 현재 위치가 0이 될 때까지 위의 과정을 반복합니다.

    코드 구현

    #include <iostream>
    #include <bits/stdc++.h>
    using namespace std;
    
    // 재귀 함수로 순간이동과 점프를 처리하는 함수
    void DFS(int n, int &ans){
        // 재귀의 기본 조건, n이 0 이하가 되면 함수를 종료
        if(n <= 0){
            return;
        }
        // 순간이동: 현재 위치가 짝수일 경우
        if(n % 2 == 0){
            DFS(n/2, ans); // 현재 위치를 2로 나누어 순간이동
        }
        // 점프: 현재 위치가 홀수일 경우
        else{
            ans += 1; // 점프는 건전지 사용량을 1 증가시킴
            DFS(n - 1, ans); // 현재 위치에서 1을 빼어 점프
        }
    }
    
    // 주어진 목적지까지 이동하는데 필요한 최소 건전지 사용량을 계산하는 함수
    int solution(int n)
    {
        int ans = 0; // 건전지 사용량을 저장할 변수
    
        // 첫 번째 호출
        if(n % 2 == 0){
            DFS(n/2, ans);
        }
        else{
            ans += 1;
            DFS(n - 1, ans);
        }
        return ans; // 계산된 최소 건전지 사용량 반환
    }

    코드 설명

    • 주어진 목적지에서 시작하여, 위치가 0이 될 때까지 순간이동과 점프를 결정합니다.
    • 현재 위치가 짝수일 경우 순간이동을 선택하고, 홀수일 경우 점프를 선택합니다.
    • 점프를 할 때마다 건전지 사용량을 1 증가시킵니다.
    • 최종적으로 계산된 건전지 사용량을 반환합니다.

    결론

    "점프와 순간 이동" 문제의 해결은 순간이동을 최대한 활용하여 점프 횟수를 줄이는 데 있습니다. 이 접근 방식은 건전지 사용량을 최소화하는 최적의 해결책을 제공합니다.

    반응형
    다음글
    다음 글이 없습니다.
    이전글
    이전 글이 없습니다.
    댓글
조회된 결과가 없습니다.
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
목차
표시할 목차가 없습니다.
    • 안녕하세요
    • 감사해요
    • 잘있어요

    티스토리툴바