코드
#include <vector>
#include <queue> // 큐
using namespace std;
int solution(int x, int y, int n) {
vector<int> visited(1000000,0); // 1<= x,y <= 1,000,000
queue<pair<int, int>> q; // int : x에 *2,*3,+n 진행한 값 , int : 연산 횟수
if(x==y){ // x,y의 값이 시작부터 같은 경우
return 0;
}else{
q.push({x,0}); // int : x에 *2,*3,+n 진행한 값 , int : 연산 횟수
}
// first : x에 *2,*3,+n 진행한 값, second : 연산 횟수
while(!q.empty()){
auto Qnum=q.front(); // Qnum -> q값 저장
q.pop();
if(Qnum.first+n<=y && visited[Qnum.first+n]==0){ // n값을 더하고, n값을 더한 결과값이 처음 나왔을 경우 (첫 방문)
visited[Qnum.first+n]++; // 방문 표시로 증감연산
if(Qnum.first+n==y){ // y값과 같아졌을 때
return Qnum.second+1; // 연산 횟수 증감 후 리턴
}else{
q.push({Qnum.first+n,Qnum.second+1}); // 아닐 경우 연산한 값과 연산 회수 q에 삽입
}
}
if(Qnum.first*2<=y && visited[Qnum.first*2]==0){ // *2 연산 -> 위의 경우와 같은 패턴
visited[Qnum.first*2]++;
if(Qnum.first*2==y){
return Qnum.second+1;
}else{
q.push({Qnum.first*2,Qnum.second+1});
}
}
if(Qnum.first*3<=y && visited[Qnum.first*3]==0){ // *3 연산 -> 위의 경우와 같은 패턴
visited[Qnum.first*3]++;
if(Qnum.first*3==y){
return Qnum.second+1;
}else{
q.push({Qnum.first*3,Qnum.second+1});
}
}
}
return -1; // x를 y로 변환할 수는 경우 -1 리턴
}
'C++ > programmers 코딩테스트(level 2) C++' 카테고리의 다른 글
[C/C++] programmers Level 2 큰 수 만들기 (0) | 2023.11.03 |
---|---|
[C/C++] programmers Level 2 소수 찾기 (0) | 2023.11.02 |
[C/C++] programmers Level 2 2 x n 타일링 (2) | 2023.11.01 |
[C/C++] programmers Level 2 롤케이크 자르기 (0) | 2023.10.30 |
[C/C++] programmers Level 2 땅따먹기 (0) | 2023.10.29 |