Post

[2017 팁스타운] 예상 대진표

[2017 팁스타운] 예상 대진표

🙋‍♂️ 들어가며

이번 문제는 틀렸던 접근법과 맞는 풀이 2개로 작성할 것이다.

우선 나는 a,b 중 작은 값 1개를 start, 큰값을 target으로 만들어 while문 내의 for문의 범위를 i = start, i <= power * 2 만큼 증가시켜서 i == target일때 횟수를 반환하면 된다고 생각했다 내 추측의 근거로는 다음 그림과 같다

ex) 12, 16이 대결할때 3번째에서 만난다.

Desktop View

❌ 틀린 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
    public int solution(int n, int a, int b) {
        int cnt = 1;
        
        int power = 1;
        boolean stop = false;
        int start = Math.min(a,b);
        int target = Math.max(a,b);
        
        while (true) {
            for (int i = start; i <= start + power; i++) {
                if (i == target) {
                    stop = true;
                    break;
                }
            }
            if (stop) break;
            cnt++;
            power *= 2;
        }
        
        
        return cnt;
    }
}


testcase는 맞았으나 제출할때는 틀렸다.

다시 보니 반례가 있었다

a = 2

b = 3

일 경우에 cnt = 2 인데

나의 코드로는 1을 반환하기 때문이다

🙋‍♂️ 다른 접근

이번에는

a /= 2

b /= 2

를 수행하면 되겠다고 생각했으나 역시 a = 2, b = 3일때 틀린다.

아 그렇다면 다음과 같이 수행해보자

(a+1) /= 2

(b+1) /= 2

✅ 정답 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
    public int solution(int n, int a, int b) {
        int cnt = 0;
        
        while (true) {
            a = (a+1) / 2;
            b = (b+1) / 2;
            cnt++;
            if (a == b) break;
        }
        
        return cnt;
    }
}

맞다.

느낀점

문제를 잘 읽자

문제에 N/2 라고 힌트를 주었는데 못 읽은 나의 잘못이다.

This post is licensed under CC BY 4.0 by the author.

Trending Tags

도움이 필요하면
나를 눌러 구리🐻
챗봇
너굴
bot
어서와 구리 ʕ ·ᴥ·ʔ
무엇이 필요하셔 구리?

Trending Tags

도움이 필요하면
나를 눌러 구리🐻
챗봇
너굴
bot
어서와 구리 ʕ ·ᴥ·ʔ
무엇이 필요하셔 구리?