1차 실행 오류
a, b의 차수가 같은 경우를 고려하지 않음.
class Solution
{
public int solution(int n, int a, int b)
{
int answer = 0;
int boundary = 2;
int round = 1
while(true) {
if (boundary >= a && boundary >= b) {
answer = round;
return answer;
}
boundary *= 2;
round++;
}
}
}
2차 실행 오류
차수가 0인 경우를 고려하지 않음.
class Solution
{
public int solution(int n, int a, int b)
{
int answer = 0;
int degreeA = 1;
int degreeB = 1;
int i = 2;
// a가 속한 범위의 차수 구하기
while(true) {
if (i >= a) {
break;
}
i *= 2;
degreeA++;
}
// b가 속한 범위의 차수 구하기
i = 2;
while(true) {
if (i >= b) {
break;
}
i *= 2;
degreeB++;
}
if (degreeA > degreeB) {
answer = degreeA;
return answer;
}
else if (degreeA < degreeB) {
answer = degreeB;
return answer;
}
else {
n = (int)Math.pow(2, degreeA - 1);
a %= (int)Math.pow(2, degreeA - 1);
b %= (int)Math.pow(2, degreeB - 1);
return solution(n, a, b);
}
}
}
3차 실행 오류
재귀 시 a 또는 b가 나누어 떨어져서 0이 나오는 경우의 수를 고려하지 않음.
class Solution
{
public int solution(int n, int a, int b)
{
int answer = 0;
int degreeA = 1;
int degreeB = 1;
int i = 2;
// a가 속한 범위의 차수 구하기
while(true) {
if (a == 1) {
degreeA = 0;
break;
}
if (i >= a) {
break;
}
i *= 2;
degreeA++;
}
// b가 속한 범위의 차수 구하기
i = 2;
while(true) {
if (b == 1) {
degreeB = 0;
break;
}
if (i >= b) {
break;
}
i *= 2;
degreeB++;
}
if (degreeA > degreeB) {
answer = degreeA;
return answer;
}
else if (degreeA < degreeB) {
answer = degreeB;
return answer;
}
else {
n = (int)Math.pow(2, degreeA - 1);
a %= (int)Math.pow(2, degreeA - 1);
b %= (int)Math.pow(2, degreeB - 1);
return solution(n, a, b);
}
}
}
주어진 문제에서 수학적인 규칙을 찾아내는 연습이 부족함.
여러 문제를 풀어보며 경험을 쌓을 것.
소요 시간: 1시간 11분 57초
class Solution
{
public int solution(int n, int a, int b)
{
int answer = 0;
int degreeA = 1;
int degreeB = 1;
int i = 2;
// a가 속한 범위의 차수 구하기
while(true) {
if (a == 1) {
degreeA = 0;
break;
}
if (i >= a) {
break;
}
i *= 2;
degreeA++;
}
// b가 속한 범위의 차수 구하기
i = 2;
while(true) {
if (b == 1) {
degreeB = 0;
break;
}
if (i >= b) {
break;
}
i *= 2;
degreeB++;
}
if (degreeA > degreeB) {
answer = degreeA;
return answer;
}
else if (degreeA < degreeB) {
answer = degreeB;
return answer;
}
else {
n /= 2;
a %= n;
if (a == 0) {
a = n;
}
b %= n;
if (b == 0) {
b = n;
}
return solution(n, a, b);
}
}
}
정답 코드 1
class Solution
{
public int solution(int n, int a, int b)
{
return Integer.toBinaryString((a-1)^(b-1)).length();
}
}
정답 코드 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;
}
}