정코딩
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 1463 1로 만들기 JAVA

    2021. 11. 4.

    by. soonil

    해당 문제는 처음에는 쉬울 거라 생각했는데 문제를 풀다 보니 DP를 이용해야 하는 문제인 걸 알게 되었고 이제 일련의 답을 나열해가면서 특정 관계를 찾을 수 있었다.

     

    https://www.acmicpc.net/problem/1463

     

    1463번: 1로 만들기

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

    www.acmicpc.net

    DP ver

    https://github.com/JUNGSOONIL/JAVA/blob/main/BAEKJOON%201463

     

    GitHub - JUNGSOONIL/JAVA: JAVA 소스 코드

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

    github.com

    BFS ver

    https://github.com/JUNGSOONIL/JAVA/blob/main/BAEKJOON%201463%20BFS

     

    GitHub - JUNGSOONIL/JAVA: JAVA 소스 코드

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

    github.com

    ​

    해당 문제는 입력받은 정수를 1로 만드는 과정에서 최소 횟수를 구하는 문제이다.

    조건

    X가 3으로 나누어떨어지면, 3으로 나눈다.

    X가 2로 나누어떨어지면, 2로 나눈다.

    1을 뺀다.

    해당 조건을 이용해 최솟값을 출력하면 된다.

    ​

    처음에는 그냥 if 문을 통해 3이나 2로 나눠지면 나누고 아니면 1을 빼고 이런 식으로 문제를 해결했더니 생각해 보니 최솟값을 비교하지 않고 하나의 값만 출력되는 걸 확인했고 이에 어떻게 할지 고민하다 구글의 힘을 빌려 DP를 사용해야 하는 것을 알게 되었다.

    ​

    1 : 1로 만들어졌으니 횟수 0

    2 : 2로 나누면 1이니 횟수 1

    3 : 3으로 나누면 1이니 횟수 1

    4 : 2로 나누면 2, 2로 나누면 1이니 횟수 2

    5 : 1을 빼주면 4, 2로 나누면 2, 2로 나누면 1이니 횟수 3

    6: 3으로 나누면 2, 2로 나누면 1이니 횟수 2 or 2로 나누면 3, 3으로 나누면 1이니 횟수 2

    7 : 1을 빼주면 6, 3으로 나누면 2, 2로 나누면 1이니 횟수 2 or 1을 빼주고, 2로 나누면 3, 3으로 나누면 1이니 횟수 2

    8 : 2로 나누면 4 , 2로 나누면 2, 2로 나누면 1이니 횟수 3

    9 : 3으로 나누면 3, 3으로 나누면 1이니 횟수 2

    10: 2로나 누면 5, 1을 빼주고, 2로 나누면 2, 2로 나누면 1이니 횟수 4 or 1을 빼주면 9, 3으로 나누면 3, 3으로 나누면 1이니 횟수 3

    이런 식인 것 을 확인할 수 있다.

    ​

    여기서 보면 4는 2로 나눈 횟수에서 2의 횟수를 더하면 되고 5는 1을 빼준 횟수에 4의 횟수를 더해주면 되고 8의 경우 2로 나눈 횟수에 4를 더해주면 된다.

    ​

    이를 토대로 2로 나눠질 경우 2로 나눈 몫에 해당하는 횟수에 +1을 한 것과 1을 뺀 수에 해당하는 횟수에 +1을 한 것과 비교하여 더 작은 수를 저장해 주고 3으로 나눠질 경우 3으로 나눈 몫에 해당하는 횟수에 +1을 한 것과 1을 뺀 수에 해당하는 횟수에 +1을 한 것과 비교하여 더 작은 수를 저장해 준다.

    이때 if 문과 else if 문이 아닌 둘 다 if 문으로 비교하여야 최솟값을 찾아낼 수 있다.

    ​

    2021.09.14 (추가) 해당 문제를 다시 풀어보았는데 이번엔 dp뿐만 아니라 bfs로도 가능할 거 같아서

    한번 풀어보았다. 문제는 해결했는데 역시 dp가 더 빠르다.

    728x90

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

    Baekjoon 9019 DSLR JAVA  (0) 2021.11.05
    Baekjoon 1978 소수 찾기 JAVA  (0) 2021.11.04
    Baekjoon 13305 주유소 JAVA  (0) 2021.11.04
    Baekjoon 1065 한수 JAVA  (0) 2021.11.04
    Baekjoon 1244 스위치 켜고 끄기 JAVA  (0) 2021.11.04

    댓글

    관련글

    • Baekjoon 9019 DSLR JAVA 2021.11.05
    • Baekjoon 1978 소수 찾기 JAVA 2021.11.04
    • Baekjoon 13305 주유소 JAVA 2021.11.04
    • Baekjoon 1065 한수 JAVA 2021.11.04
    맨 위로
전체 글 보기
  • Baekjoon
  • Solved
  • Github
Tistory 로그인
Tistory 로그아웃
로그아웃 글쓰기 관리

Today

Total

Designed by Nana
블로그 이미지
soonil

티스토리툴바