[Line]2019年上半期LINE実習生募集コードテスト
12609 ワード
質問リンク
実装+BFS使用最短時間の問題
ブラウンは2秒後に元の位置に戻ることができます.
ex) 2 -> 1 -> 2
コンニが11秒でxに着いたら
1,3,5,7,9,11秒に1回、ブラウンがその格子に着いたら、コンニを捕まえることができます.
コンニが10秒でxに着いたら
0,2,4,6,8,10秒に一度、ブラウンがその格子に着いたら、彼を捕まえることができます.
したがって、到着時間を奇数と偶数に分ける必要があります.
1.問題を理解する
実装+BFS使用最短時間の問題
2.問題分析
1.ブラウンが特定セルに到達した時刻:BFSに移動
2.ブラウンは特定の時間内にコンニが到着した格子内に到着できるかどうか:
ブラウンは2秒後に元の位置に戻ることができます.
ex) 2 -> 1 -> 2
コンニが11秒でxに着いたら
1,3,5,7,9,11秒に1回、ブラウンがその格子に着いたら、コンニを捕まえることができます.
コンニが10秒でxに着いたら
0,2,4,6,8,10秒に一度、ブラウンがその格子に着いたら、彼を捕まえることができます.
したがって、到着時間を奇数と偶数に分ける必要があります.
3.コード
public class Main {
static boolean[][] visited = new boolean[200_001][2];
static final int even = 0, odd = 1;
static Queue<Integer> q = new LinkedList<>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int conyPosition = sc.nextInt();
int brown = sc.nextInt();
q.add(brown);
visited[brown][even] = true;
visited[brown][odd] = true;
int time = 0;
while(inRange(conyPosition)) {
int timeRemainder = time%2;
if(visited[conyPosition][timeRemainder]) {//끝
System.out.println(time);
return;
}
time++;
conyPosition += time;
updateNextBrown(q.size(), time);
}
System.out.println(-1);
}
public static void updateNextBrown(int size, int time) {
for(int i = 0; i < size; i++) {
int index = q.poll();
int[] nextIndex = {index-1, index+1, index*2};
int timeRemainder = time%2;
for(int j = 0; j < 3; j++) {
int now = nextIndex[j];
if(inRange(now) && !visited[now][timeRemainder]) {
visited[now][timeRemainder] = true;
q.add(now);
}
}
}
}
public static boolean inRange(int num) {
if(0 <= num && num <= 200_000) {
return true;
} else {
return false;
}
}
}
Reference
この問題について([Line]2019年上半期LINE実習生募集コードテスト), 我々は、より多くの情報をここで見つけました https://velog.io/@mincho920/Line-2019-상반기-LINE-인턴-채용-코딩테스트テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol