[프로그래머스] 2017 팁스타운 - 예상 대진표

Minji·2024년 1월 5일

2017 팁스타운 - 예상 대진표

문제 접근 🤔


  • 대진표의 규칙성을 찾으면 쉽게 해결되는 문제
  • 입력값이 8, 4, 7 인 경우, 4 → 2 → 1 , 7 → 4 → 2 가 되어 3번째 라운드에서 맞붙게 된다.
  • 예시에서 규칙성을 찾아봤을 때, 다음 라운드의 번호는 현재의 번호가 홀수인 경우 1을 더해 2로 나눈 몫이 되고 짝수인 경우 2로 나눈 몫이 된다.
  • 이를 하나로 수식화하면, 현재의 번호를 2로 나눈 몫을 올림 한 값임을 알 수 있다.
  • 또한 최종적으로 같은 조에 속하게 되었을 때 누가 승리하든 번호를 같은 값인 2로 나눈 몫을 반올림 한 값으로 변경되어야 한다.
  • 4 → 2 → 1 → 1 , 7 → 4 → 2 → 1 이므로 둘의 번호가 같아질 때까지 반복문을 돌려 확인하면 된다.


놓쳤던 부분 😅


  • 문제 자체는 쉬운데 오답이 나와서 로그를 찍어보니, round(0.5) 인 경우에는 1이 아닌 0을 반환해주는 것 🤯

  • 반올림 처리를 할 때 사용했던 round 함수가 문제라 올림 처리를 해주는 math.ceil 함수를 이용하니 해결되었다.

  • 이런 결과가 나온 이유는 파이썬의 round 함수가 반올림할 때 짝수에 묶는 "ROUND_HALF_EVEN" 방식을 사용하기 때문이다.

  • 이 방식은 짝수에 가까운 쪽으로 반올림 한다.

  • 따라서 round(0.5) = 0, round(1.5) = 2, round(2.5) = 2, round(3.5) = 4가 된다. (왜 그렇게 하는거죠?!)

  • 우리가 흔히 알고 있는 반올림은 "ROUND_HALF_UP" 방식이다.

  • Python 3.x에서 기본 제공하는 round 함수는 "ROUND_HALF_EVEN"만을 지원한다.

  • "ROUND_HALF_UP"를 사용하기 위해서는 별도의 함수를 구현해야만 한다.

[해결방안]

Python(파이썬) round 함수 반올림 오류 해결, format 반올림, 0.5 반올림

[ROUND_HALF_EVEN 사용하는 이유]

[Python] round()함수와 round-half-even



코드 😁


파이썬 코드

import math

def solution(n,a,b):
    rnd = 0
    while a != b:
        a = math.ceil(a / 2)
        b = math.ceil(b / 2)
        rnd += 1

    return rnd

자바스크립트 코드

const solution = (n, a, b) => {
  let rnd = 0;

  while (a !== b) {
    a = Math.round(a / 2);
    b = Math.round(b / 2);
    rnd++;
  }
  return rnd;
};
profile
기록을 좋아하는 프론트엔드 개발자입니다.

0개의 댓글