주녘공부일지

[프로그래머스 C#] Lv.2 예상 대진표 본문

Programmers - C#/CodingTest Lv.2

[프로그래머스 C#] Lv.2 예상 대진표

주녘 2023. 12. 10. 15:57
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/12985

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1. 정답코드 및 핵심 아이디어, 유의사항

문제풀이 아이디어가 중요한 문제- 대진표는 2의 n승의 개수만큼 주어지고, 라운드가 진행될 때마다 대진하는 대상은 무조건 반으로 줄어들기 때문에 수식화가 가능함을 여기서 느낌 - 자신의 번호가 라운드 진행에 따라 두 가지로 변하는 것을 확인할 수 있음 -> 짝수일 경우 : 자신의 번호에 2를 나눔 -> 홀수일 경우 : 자신의 번호에 2를 나누고 1을 더함

 

주석 참조

    using System;

    class Solution
    {
        public int solution(int n, int a, int b)
        {
            int answer = 0;

            // 같은 라운드가 될 때까지 진행
            while (a != b)
            {
                // 라운드 1회 진행
                a = Function(a);
                b = Function(b);
                answer++;
            }

            return answer;
        }

        // num이 짝수면 2로 나누고, 홀수면 2로 나눈 값에 +1을 해서 리턴하는 메서드
        public int Function(int num)
        {
            if (num % 2 == 0)
                return num / 2;
            else
                return num / 2 + 1;
        }
    }

 

해당 코드를 더 간략하게 할 수 있는데, 그 방법은 Function은 결국 2로 나누고, 나누기 전의 값이 홀수면 생기는 나머지 값인 1을 더한 값을 리턴할 뿐이기 때문에 아래 코드와 같이 줄일 수 있음

    using System;

    class Solution
    {
        public int solution(int n, int a, int b)
        {
            int answer = 0;

            // 같은 라운드가 될 때까지 진행
            while (a != b)
            {
                // 라운드 1회 진행
                a = (a / 2) + (a % 2);
                b = (b / 2) + (b % 2);
                answer++;
            }

            return answer;
        }
    }
728x90