Skip to content

[백준 1697 숨바꼭질] 최적화 #1

Description

@lSNOTNULL

기존 로직 : 변수명 중복 및 간소화를 위해 향상된 for문 사용 및 최적화 필요

...
while (!queue.isEmpty()) {
                int current = queue.poll();
                
                if(current-1 >= 0 && !visited[current-1]) {
                    queue.add(current-1);
                    time[current-1] = time[current]+1;
                    visited[current-1] = true;
                }if(current+1 <= 100000 && !visited[current+1]) {
                    queue.add(current+1);
                    time[current+1] = time[current]+1;
                    visited[current+1] = true;
                } if(current*2 <= 100000 && !visited[current*2]) {
                    queue.add(current*2);
                    time[current*2] = time[current]+1;
                    visited[current*2] = true;
                }
            }

next == K 조건문을 for문안에 넣어 해결하려 했지만, 시작지점이 N==K의 경우 반례가 생김. ( 한 번 이동한 뒤의 위치를 기준으로 비교하기 때문 )

...
...
while (!queue.isEmpty()) {
                int current = queue.poll();
                int[] nextPositions = {current-1, current+1, current*2};
                
                for(int next: nextPositions) {
                    if(next >= 0 && next<= 100000 && !visited[next]) {
                        queue.add(next);
                        time[next] = time[current]+1;
                        visited[next] = true;
                        
                        if(next == K) {
                            bw.write(String.valueOf(time[next]));
                            bw.flush();
                            return;
                        }
                    }
                }
            }

queue에서 꺼낸 직후 current를 바로 비교하여 해결

...
            while (!queue.isEmpty()) {
                int current = queue.poll();
                if(current == K) {
                            bw.write(String.valueOf(time[current]));
                            bw.flush();
                            return;
                        }
                int[] nextPositions = {current-1, current+1, current*2};
                
                for(int next: nextPositions) {
                    if(next >= 0 && next<= 100000 && !visited[next]) {
                        queue.add(next);
                        time[next] = time[current]+1;
                        visited[next] = true;   
                    }
                }
            }

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions