https://school.programmers.co.kr/learn/courses/30/lessons/12985#qna
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드
class Solution
{
public int solution(int n, int a, int b)
{
/*
각 자리에서 1을 더한 후 2로 나누면 다음 라운드의 숫자가 된다. 카운트를 1씩 증가한다.
위 결과를 a-b==1 가 되는 순간 카운트를 리턴한다.
*/
int answer = 1;
int bigger=0;
int smaller=0;
if(a>b){
bigger=a;
smaller=b;
}
else{
bigger=b;
smaller=a;
}
while( (bigger%2!=0) || (bigger-smaller!=1) ){
bigger = (bigger+1)/2;
smaller = (smaller+1)/2;
answer++;
}
return answer;
}
}
a, b가 어떤 수이든, 1을 더한 후 2로 나눈 몫이 다음 라운드의 값이 된다.
처음 생각한 로직은 위의 규칙을 이용해서 a와 b의 차가 1인 경우 끝나도록 했는데 반례가 존재했다.
a,b 가 [4,5] 인 경우이다.
즉 a와 b의 차가 1임에도 둘은 해당 라운드에서 붙지 않는다.
이와 같은 경우를 해결하기 위해 "a와 b중 큰 값이 2로 나누어떨이진다" 라는 조건을 추가했다.
"a와 b중 큰 값이 2로 나누어떨어지면서 a와 b의 차가 1이면" 해당 라운드에서 붙게 된다.
풀고 보니 어렵지 않은 것 같은데.. 헷갈려서 많이 헤맸던 문제였던 것 같다.
50분정도 소요됬다.
'알고리즘 > 문제' 카테고리의 다른 글
| [프로그래머스] Lv2 멀리뛰기 / JAVA (0) | 2023.03.06 |
|---|---|
| [프로그래머스] Lv2 점프와 순간이동 / JAVA (0) | 2023.03.04 |
| <실패>[프로그래머스] Lv2 구명보트 / JAVA (0) | 2023.02.28 |
| [프로그래머스] Lv2 카펫 / JAVA (0) | 2023.02.27 |
| [프로그래머스] Lv2 영어 끝말잇기 / JAVA (0) | 2023.02.26 |
