문제
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이
x, y가 1에서 100만 사이의 값을 가지므로, 이중 for문과 같은 O(N^2)와 같은 풀이는 절대 안된다.
x, y가 좌표라고 치면 최소 이동거리를 계산을 하는 것이 변환하기 위한 최소 연산 횟수라고 생각했다.
최소 이동거리를 계산하기 위해서, bfs를 사용해서 현재 위치가 목표 위치가 되었을때, 최소 연산의 횟수를 구한다.
소스코드
import java.util.*;
class Solution {
private static class Point {
int pos;
int cnt;
Point(int pos, int cnt) {
this.pos = pos;
this.cnt = cnt;
}
}
public int solution(int x, int y, int n) {
ArrayDeque<Point> queue = new ArrayDeque<>();
boolean[] visited = new boolean[1_000_001];
int answer = Integer.MAX_VALUE;
queue.addLast(new Point(x, 0));
visited[x] = true;
while (!queue.isEmpty()) {
Point cur = queue.removeFirst();
int pos = cur.pos;
int cnt = cur.cnt;
if (pos == y) {
return cnt;
}
int nextPos = pos + n;
if (1 <= nextPos && nextPos < 1_000_001) {
if (!visited[nextPos]) {
queue.addLast(new Point(nextPos, cnt + 1));
visited[nextPos] = true;
}
}
nextPos = pos * 2;
if (1 <= nextPos && nextPos < 1_000_001) {
if (!visited[nextPos]) {
queue.addLast(new Point(nextPos, cnt + 1));
visited[nextPos] = true;
}
}
nextPos = pos * 3;
if (1 <= nextPos && nextPos < 1_000_001) {
if (!visited[nextPos]) {
queue.addLast(new Point(nextPos, cnt + 1));
visited[nextPos] = true;
}
}
}
return -1;
}
}'Problem Solving > Programmers' 카테고리의 다른 글
| [Programmers] n보다 커질 때까지 더하기 - Java (0) | 2025.05.05 |
|---|---|
| [Programmers] 체육복 - Java (0) | 2025.05.04 |
| [Programmers] 서버 증설 횟수 - Java (0) | 2025.03.27 |
| [Programmers] 뒤에 있는 큰 수 찾기 - Java (0) | 2025.03.24 |
| [Programmers] 크기가 작은 부분문자열 - Java (0) | 2025.03.19 |