코딩테스트
[프로그래머스] 자바(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;
}
}
- 2명씩 토너먼트 형식으로 진행되고, `a`와 `b` 참가자는 무조건 승리한다는 가정하에 다음 라운드 진출
- 순서 번호 계산
- 다음 라운드의 순서 번호는 현재 라운드의 순서 번호를 2로 나눈 값
- 짝수일 경우 그대로 2로 나누고, 홀수일 경우 1을 더한 후 2로 나눔
- 반복 조건
- `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;
}
}
- 코드 간결성
- 첫 번째 코드에서는 `a`와 `b`의 값이 짝수인지 홀수인지 확인하고, 그에 따른 분기 처리를 하였음
- 이로 인해 조건문이 많이 사용되어 코드가 다소 복잡해보임
- 불필요한 조건문 제거
- `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
- 종료 조건
- 첫 번째 코드는 `Math.abs(a - b) >= 1` 조건을 사용하여 반복을 멈추지만, 실제로 a와 b가 만나는 조건은 `a == b`
- 두 번째 코드는 `a != b` 조건을 사용하여 a와 b가 같아질 때까지 반복
🧠 배운 점
- 코드 간결성과 효율성
- 같은 결과값을 도출해내는 코드라고 어떻게 하면 더 간결하고 효율적으로 작성할 수 있는지 배울 수 있었다.
- 불필요한 조건문을 제거하고 일관된 연산 방식을 사용하여 코드의 가독성과 효율성을 높임
- 이진수 연산의 활용
- 특정 값을 2로 나누는 것을 비트를 오른쪽으로 한 칸 쉬프트하는 것과 동일하다