[프로그래머스] Lv.2 숫자 변환하기

2023. 7. 5. 23:23·Algorithms(CT)/Programmers

문제 링크

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

 

프로그래머스

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

programmers.co.kr

 

 


💡 아이디어

x를 y로 변환하는 최소한의 연산 횟수를 구해야 하기 때문에 BFS로 풀어야겠다고 생각했습니다.

 

 

📗 풀이과정

1. BFS를 수행하기 위해 연산된 숫자와 연산 횟수를 저장할 수 있도록 Queue를 int [] 형으로 선언합니다.

import java.util.*;

Queue<int[]> q = new LinkedList<>();

 

2. x부터 연산이 시작되기 때문에 Queue에 x와 연산횟수0을 넣습니다.

q.add(new int[]{x,0});

 

3. 기존에 한 번 수행했던 연산을 다시 하지 않기 위해 visited배열을 선언합니다.

static boolean[] visited = new boolean[1000001]; // 1 <= x <= 1000000

 

4. while반복문에서 q가 비어있어있지 않을 때, 아래의 연산들을 수행합니다.

 

5. 현재 Queue의 맨 앞을 빼주고, 만약 그 수가 y인지 확인합니다. 만약 y라면 현재 연산 횟수를 cnt에 넣고 반복문을 나옵니다.

int[] now = q.poll();

if(now[0]==y){
	cnt=now[1];break; //연산횟수 cnt에 넣고 break
}

 

6. y가 아니라면, Queue에 현재 숫자(now [0])+n, now [0]*2, now [0]*3한 값을 연산 횟수+1 해서 넣어줍니다.

 

(* 여기서 주의해야할 점은 now [0]+n, now [0]*2, now [0]*3 이 y를 넘거나, 최소 연산 횟수를 구하는 것이므로 이미 연산했던 값이면 Queue에 넣지 않습니다.)

if(now[0]+n<=y && !visited[now[0]+n]){ //다음 숫자가 y보다 작거나 같고, 연산을 수행하지 않았으면
	q.add(new int[]{now[0]+n, now[1]+1});
	visited[now[0]+n]=true;
}
if(now[0]*2<=y && !visited[now[0]*2]){
	q.add(new int[]{now[0]*2,now[1]+1});
	visited[now[0]*2]=true;
}
if(now[0]*3<=y && !visited[now[0]*3]){
	q.add(new int[]{now[0]*3, now[1]+1});
	visited[now[0]*3]=true;
}

 

7. 만약 반복문이 종료될 때까지 y로 변환할 수 없다면 초기 선언값인 -1을 return 합니다.

 


전체 코드

import java.util.*;
class Solution {
    static boolean[] visited = new boolean[1000001];
    public int solution(int x, int y, int n) {
        
        return bfs(x,y,n);
    }
    //너비 우선 탐색 bfs
    int bfs(int x, int y, int n){
        
        int cnt=-1;
        Queue<int[]> q = new LinkedList<>();
        q.add(new int[]{x,0});
        
        while(!q.isEmpty()){
            int[] now = q.poll();
            if(now[0]==y){
                cnt = now[1];break;
            }
            
            if(now[0]+n<=y && !visited[now[0]+n]){
                q.add(new int[]{now[0]+n, now[1]+1});
                visited[now[0]+n]=true;
            }
            if(now[0]*2<=y && !visited[now[0]*2]){
                q.add(new int[]{now[0]*2,now[1]+1});
                visited[now[0]*2]=true;
            }
            if(now[0]*3<=y && !visited[now[0]*3]){
                q.add(new int[]{now[0]*3, now[1]+1});
                visited[now[0]*3]=true;
            }
        }
        
        return cnt;
    }
}

'Algorithms(CT) > Programmers' 카테고리의 다른 글

[프로그래머스] Lv.2 택배상자  (0) 2023.07.06
[프로그래머스] Lv.2 쿼드 압축 후 개수 세기  (0) 2023.07.06
[프로그래머스] Lv.2 2개 이하로 다른 비트 (Java)  (1) 2023.07.04
[프로그래머스] Lv.2 뒤에 있는 큰 수 찾기 (Java)  (0) 2023.07.01
[프로그래머스]Lv2. 파일명 정렬 (Java)  (0) 2023.06.29
'Algorithms(CT)/Programmers' 카테고리의 다른 글
  • [프로그래머스] Lv.2 택배상자
  • [프로그래머스] Lv.2 쿼드 압축 후 개수 세기
  • [프로그래머스] Lv.2 2개 이하로 다른 비트 (Java)
  • [프로그래머스] Lv.2 뒤에 있는 큰 수 찾기 (Java)
gwee_99
gwee_99
bE bETTER!
  • gwee_99
    얼렁이와 뚱땅이
    gwee_99
  • 전체
    오늘
    어제
    • ====Category====
      • Algorithms(CT)
        • Programmers
        • Baekjoon
        • Goorm
      • Web
        • Error 해결
      • BackEnd
        • Spring
        • JPA
      • FrontEnd
        • HTML.CSS
        • JavaScript
      • Language
        • Java
      • Cloud
      • CSTS
      • Books
        • IT 5분 잡학사전
      • 일상
  • 블로그 메뉴

    • 홈
    • 방명록
    • 글쓰기
    • 관리
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    lv2
    인프런
    DP
    노마드코더
    제대로 파는 자바스크립트
    Til
    백준
    따라하며 배우는 html css
    Greedy
    개발자북클럽
    java
    그리디
    LV.2
    BFS
    DFS
    IT 5분 잡학사전
    BOJ
    lv.4
    호텔 대실
    Lv.1
    스택
    존안님
    코딩테스트
    구름
    LV.3
    프로그래머스
    IT 잡학사전
    구름톤 챌린지
    자바
    HTML
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gwee_99
[프로그래머스] Lv.2 숫자 변환하기
상단으로

티스토리툴바