프로그래머스_예상 대진표

LeeYulhee·2023년 9월 21일
0

💻 문제 출처 : 프로그래머스_예상 대진표

👉 내가 작성한 답


public class Solution {
class Solution {
    public int solution(int n, int a, int b) {
        
        int min = Math.min(a, b);
        int max = Math.max(a, b);
        
        int round = 1;
        
        while(true) {

            if(max - min ==  1 && (min - 1) / 2 == (max - 1) / 2) {
                return round;
            }
            
            min = min % 2 == 1 ? (min + 1) / 2 : min / 2;
            max = max % 2 == 1 ? (max + 1) / 2 : max / 2;
            
            round++;
        }
    }
}
  • 📌 접근 방식
    • 두 수의 차가 1이어야 하고, 해당 라운드에 같은 범위여야 함
    • 범위의 판별은 (수 - 1) / 2를 했을 때 몫이 같아야 함
  • 📌 문제 풀이 설명
    • int 변수 min을 선언하고 a와 b 중 작은 수로 초기화, int 변수 max를 선언하고 a와 b 중 큰 수로 초기화
    • int 변수 round를 선언하고 1로 초기화
    • while문으로 순회
      • 만약 max - min이 1과 같고, (min - 1) / 2 와 (max - 1) / 2 가 같다면
        • ➕ (min - 1) / 2 와 (max - 1) / 2 가 같은 건 서로의 라운드가 같은 경우로, 최초에는 멀리 떨어져 있어도 while문을 반복할 수록 max와 min이 짝수의 2로 나눠지기 때문에 점점 가까워지고 결국 몫이 같아짐
          • min - 1과 max - 1을 한 건 1, 2가 2로 나눴을 때, 같은 몫을 가지기 위해서
        • return round
      • min이 만약 홀수면 min + 1을 해서 / 2한 값을 대입하고, 아니면 min / 2를 대입
      • max가 만약 홀수면 max + 1을 해서 / 2한 값을 대입하고, 아니면 max / 2를 대입



👉 다른 사람이 작성한 답 - 1


class Solution {
    public int solution(int n, int a, int b) {
        return Integer.toBinaryString((a-1)^(b-1)).length();
    }
}
  • 📌 접근 방식
    • 인덱스로 생각해서 계산하기 위해(0부터 세기 위해) 각 수에서 - 1을 하고, 이진수로 변환한 뒤에 XOR 연산을 한 결과의 길이가 경기 횟수와 같음
  • 📌 문제 풀이 설명
    • a - 1과 b - 1을 XOR 연산 처리해서 이진수로 변환하고, 그 길이를 return



👉 다른 사람이 작성한 답 - 2


class Solution {
    public int solution(int n, int a, int b) {
        int round = 0;
        while(a != b) {
            a = a/2 + a%2;
            b = b/2 + b%2;
            round++;
        }
        return round;
    }
}
  • 📌 접근 방식
    • 매 라운드마다 A와 B가 다르다면 라운드를 하나씩 증가시키면서 A와 B가 같아질 때까지 반복
    • A와 B가 같다는 건 같은 라운드에서 만난다는 것을 의미
  • 📌 문제 풀이 설명
    • int 변수 round를 선언하고 0으로 초기화
    • while문으로 a와 b가 같지 않을 때 순회
      • a에 a / 2한 값 + a % 2를 대입
        • a를 2로 나눠서 다음 라운드의 번호를 구함
        • mod 2를 하는 이유는 나머지가 있으면 홀수라는 뜻이고, 홀수인 경우 다음 라운드에서 그냥 나누기만 할 경우 소수점이 되어 원하는 정수가 안 나오기 때문
      • b에 b / 2한 값 + b % 2를 대입
      • round 1 증가
    • while문 종료 후 return round
profile
공부 중인 신입 백엔드 개발자입니다

0개의 댓글