[Silver III] 1로 만들기 - 1463

2024. 10. 18. 17:15·코딩테스트/백준
목차
  1. 성능 요약
  2. 분류
  3. 제출 일자
  4. 문제 설명
  5. 입력
  6. 출력

[Silver III] 1로 만들기 - 1463

문제 링크

성능 요약

메모리: 18092 KB, 시간: 120 ms

분류

다이나믹 프로그래밍

제출 일자

2024년 10월 18일 16:19:04

문제 설명

정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.

  1. X가 3으로 나누어 떨어지면, 3으로 나눈다.
  2. X가 2로 나누어 떨어지면, 2로 나눈다.
  3. 1을 뺀다.

정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.

입력

첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.

출력

첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.
 


다음은 문제에 제시된 예시이다.
10의 경우에 10 → 9 → 3 → 1 로 3번 만에 만들 수 있다.
 
목표는 숫자를 1로 만드는 것이며 각 숫자를 1로 만들기 위한 최소 연산 횟수를 구해보자
2 → 1번 : 2로 나누었을 때 || 1을 뺐을 때
3 → 1번: 3으로 나누었을 때
4 → 2번 : 2로 두번 나누었을 때 || 2로 나누고 1을 뺐을 때
5 → 3번 : 1을 빼고 2로 두번 나누었을 때 || 1을 빼고 2로 나누고 1을 뺐을 때
 ...
 
4의 경우 기존 2의 결과에 2로 나눈 연산의 횟수를 추가한 것이며 → 4 / 2 = 2
5의 경우 기존 4의 결과에 1을 뺀 연산의 횟수를 추가한 것이다 → 5 - 1 = 4
 
결론
1) i-1을 1로 만드는 최소 횟수 + 1 (1을 빼는 연산)
2) i/2를 1로 만드는 최소 횟수 + 1 (2로 나누는 연산, i가 짝수일 때)
3) i/3을 1로 만드는 최소 횟수 + 1 (3으로 나누는 연산, i가 3의 배수일 때)
 
 
이를 통해 다음과 같은 코드를 작성할 수 있다
 

import java.io.*;
import java.util.*;

class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int[] dp = new int[Math.max(N+1,4)];
		
        // 2와 3의 최소 연산 횟수를 1로 초기화
        dp[2] = 1;
        dp[3] = 1;
        for(int i=4; i<=N; i++){
            // 이전 값에 1을 추가 -> 2로 나누어지지 않고 3으로 나누어지지 않는 경우
            // 이전 값 + 1을 한 것이므로
            dp[i] = dp[i-1] + 1;
            
            // i가 2로 나누어질 때
            if(i%2 == 0){
            	// 기존에 선언된 dp[i]값과 dp[i/2]를 비교하여 작은 값으로 최신화
                dp[i] = Math.min(dp[i], dp[i/2]+1);
            }
            // i가 3으로 나누어질 때
            if(i%3 == 0){
            	// 기존에 선언된 dp[i]값과 dp[i/3]를 비교하여 작은 값으로 최신화
                dp[i] = Math.min(dp[i], dp[i/3]+1);
            }
        }
        System.out.println(dp[N]);
        br.close();
    }
}

 
 
 
 

'코딩테스트 > 백준' 카테고리의 다른 글

[Silver II] 좌표 압축 - 18870  (1) 2024.10.23
[Gold V] AC - 5430  (1) 2024.10.20
[Gold V] 토마토 - 7576  (1) 2024.10.17
[Gold II] 가운데를 말해요 - 1655  (0) 2024.10.16
[Silver II] 유기농 배추 - 1012  (4) 2024.09.27
  1. 성능 요약
  2. 분류
  3. 제출 일자
  4. 문제 설명
  5. 입력
  6. 출력
'코딩테스트/백준' 카테고리의 다른 글
  • [Silver II] 좌표 압축 - 18870
  • [Gold V] AC - 5430
  • [Gold V] 토마토 - 7576
  • [Gold II] 가운데를 말해요 - 1655
mint723dev
mint723dev
mint723dev 님의 블로그 입니다.
  • mint723dev
    mint723dev 님의 블로그
    mint723dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (88)
      • Computer Science (16)
        • Computer Architecture (0)
        • Data Structure (2)
        • Database (4)
        • Network (4)
        • Operating System (6)
        • Software Engineering (0)
      • Java (6)
      • 자료 구조 (0)
      • 코딩테스트 (62)
        • LeetCode (1)
        • 프로그래머스 (29)
        • 백준 (32)
      • Spring (3)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    DFS
    DP
    티스토리챌린지
    deque
    JVM
    오블완
    BFS
    탐욕법
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
mint723dev
[Silver III] 1로 만들기 - 1463

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.