마이의 개발 블로그

[프로그래머스] 숫자 변환하기 (Java) 본문

코딩테스트/프로그래머스

[프로그래머스] 숫자 변환하기 (Java)

개발자마이 2023. 4. 13. 01:28
반응형
 

프로그래머스

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

programmers.co.kr

접근 방식

숫자 x를 주어진 세 가지 방식을 활용하여 y로 변환할 수 있는 최소 횟수를 구하는 문제로, BFS로 접근하여 풀어냈다. 변환된 각각의 숫자를 하나의 Node로 보고, 한 번 변환될 때마다 Node에 숫자 number와 그 숫자가 되기까지의 변환 횟수를 count 변수에 저장하도록 했다. 문제 설명대로라면 x에서 시작하여 y까지 가야하는 게 맞지만, y에서 시작하는 것이 경우의 수 소거에 유리하여 반대 방향으로 시작했다.

로직 설명

- Node 클래스(이하 노드) 생성: 멤버변수 number, count

- BFS를 구현하기 위해 필요한 노드 큐 생성: queue

- 노드를 생성하여(number: y, count: 0) queue에 넣기

- queue에 노드가 존재하는 동안 반복:

  1) 노드 한 개 poll()

  2) (노드의 number가 x와 같을 경우), answer에 노드 count 값 저장 후 루프 종료

  3) (아닐 경우) 노드의 number를 3으로 나눈 값, 2로 나눈 값, n을 뺀 값의 세 가지 경우에 대해 각각 노드를 생성하여 queue에 삽입 + 노드 생성 시 count 1 증가시키기

- 종료조건을 거치지 않은 경우 -1 반환

import java.util.*;

class Node {
    int number;
    int count;
    
    Node(int number, int count){
        this.number = number;
        this.count = count;
    }
}

class Solution {
    public int solution(int x, int y, int n) {
        int answer = -1;
        
        Queue<Node> queue = new LinkedList<>();        
        queue.offer(new Node(y, 0));

        while(queue.size() > 0){
            Node poll = queue.poll();
            int number = poll.number;
            int count = poll.count;

            if(number == x){
                answer = count;
                break;
            }
            
            if(number % 3 == 0){
                queue.offer(new Node(number / 3, count + 1));
            }
            
            if(number % 2 == 0){
                queue.offer(new Node(number / 2, count + 1));
            }
            
            if(number - n > 0){
                queue.offer(new Node(number - n, count + 1));
            }
        }
        
        return answer;   
    }    
}

Note

- DP로도 많이들 풀었던데 나중에 시도해봐야겠다.

반응형
Comments