코딩테스트

[프로그래머스] 자바(Java) - 예상 대진표

수방방 2024. 6. 7. 15:35

🧩 문제

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

 

프로그래머스

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

programmers.co.kr

 

💡 내가 작성한 코드

-> 첫 번째 코드

class Solution
{
    public int solution(int n, int a, int b)
    {
        int answer = 0;
        while(Math.abs(a - b) >= 1) {
            if(a % 2 == 0) a /= 2;
            else if(a % 2 != 0) a = (a + 1) / 2;
            
            if(b % 2 == 0) b/= 2;
            else if(b % 2 != 0) b = (b + 1) / 2;
            
            answer++;
        }

        return answer;
    }
}
  1. 2명씩 토너먼트 형식으로 진행되고, `a`와 `b` 참가자는 무조건 승리한다는 가정하에 다음 라운드 진출
  2. 순서 번호 계산
    • 다음 라운드의 순서 번호는 현재 라운드의 순서 번호를 2로 나눈 값
    • 짝수일 경우 그대로 2로 나누고, 홀수일 경우 1을 더한 후 2로 나눔
  3. 반복 조건
    • `a`와 `b`가 서로 만나기 전까지 라운드 반복
더보기

예를 들어, n = 8, a = 4, b = 7일 경우

첫 번째 라운드: a = 4 / 2 -> 2, b = (7 + 1) / 2 -> 4
두 번째 라운드: a = 2 / 2 -> 1, b = 4 / 2 -> 2
세 번째 라운드: a = 1, b = 2 (서로 만남) -> 종료

 

-> 두 번째 코드

class Solution {
    public int solution(int n, int a, int b) {
        int answer = 0;
        while (a != b) {
            a = (a + 1) / 2;
            b = (b + 1) / 2;
            answer++;
        }
        return answer;
    }
}
  1. 코드 간결성
    • 첫 번째 코드에서는 `a`와 `b`의 값이 짝수인지 홀수인지 확인하고, 그에 따른 분기 처리를 하였음
    • 이로 인해 조건문이 많이 사용되어 코드가 다소 복잡해보임
  2. 불필요한 조건문 제거
    • `a`와 `b`가 짝수인지 홀수인지에 관계없이 `(a + 1) / 2`와 `(b + 1) / 2`를 적용하면 불필요한 조건문을 제거하여 더 효율적
    • 조건문 없이 무조건 +1 을 해주는 이유는 짝수인 경우에도 올바른 다음 라운드 번호를 계산하고, 홀수인 경우에도 정확한 결과를 도출해내기 때문
    • 더보기
      번호가 짝수인 경우
          a = 4일 때: (4 + 1) / 2 = 2 -> 4 / 2 = 2 와 동일한 결과값
          b = 6일 때: (6 + 1) / 2 = 3 -> 6 / 2 = 2 와 동일한 결과값
          
      번호가 홀수인 경우
          a = 5일 때: (5 + 1) / 2 = 3
          b = 7일 때: (7 + 1) / 2 = 4
  3. 종료 조건
    • 첫 번째 코드는 `Math.abs(a - b) >= 1` 조건을 사용하여 반복을 멈추지만, 실제로 a와 b가 만나는 조건은 `a == b`
    • 두 번째 코드는 `a != b` 조건을 사용하여 a와 b가 같아질 때까지 반복

 

🧠 배운 점

  • 코드 간결성과 효율성
    • 같은 결과값을 도출해내는 코드라고 어떻게 하면 더 간결하고 효율적으로 작성할 수 있는지 배울 수 있었다.
    • 불필요한 조건문을 제거하고 일관된 연산 방식을 사용하여 코드의 가독성과 효율성을 높임
  • 이진수 연산의 활용
    • 특정 값을 2로 나누는 것을 비트를 오른쪽으로 한 칸 쉬프트하는 것과 동일하다