본문 바로가기

diary/codestates (be39)

05/06/22 [pair: java: 반복문: 1] /와 % 연산자는 소중해,,

*오늘의 개고생 문제

isOdd

입력받은 수가 홀수면 true, 짝수면 false를 리턴하기
조건1. while문을 사용해야 한다. for문 사용은 금지된다.
조건2. /와 % 연산자 사용은 금지된다.

Pair)

public boolean isOdd(int num) {
    int i = 0;
    boolean odd = true;
    
    if (num<0) {
      num *= -1;
    }
    while(i<=num){
      odd = !odd;
      i++;
    } 
    if(odd){
      return true;
    }
    return false;
}


일단 이 문제에만 시간 거의 50분 썼다. 라고 생각하고 코플릿 제출 시간 보는데 정확히 36분 썼다. 과장이 좀 심한 편 ㅎㅎㅎ 아무튼 페어분이랑 같이 보다가 조건 보는 순간부터 동시에 멍때렸다. 홀수를? 판별을? 하는데? %를? 쓰지? 말라고요? /도요? 완전 대혼란 ㅠ 그럼 +, -, *만 써야 하는데 도대체 어떻게 할 수 있나요.....? 하면서 같이 10분쯤 고민해보다가 결국 구글의 도움을 받았다.

Check a number is odd or even without modulus operator - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org


문제 푸는 데 제일 많이 참고한 reference. 근데 또 우리가 풀어야 하는 문제 조건은 while문을 사용해야 하는 거라 바로 적용 못하고 또 헤맸다. 아직 while문이 낯선 코딩 초보라구요 😭 살려줍쇼..... 아무튼 풀이를 시작하자면

int i = 0;
boolean odd = true;

while(i<=num){
    odd = !odd;
    i++;
}


일단 처음에 int i=0과 odd 변수를 선언하고 true 값을 주는 데서 시작했다. 그리고 while문에서 i를 1씩 증가시켜가면서 num과 같아질 때까지 odd = !odd를 넣어주는 연산을 계속한다. 이 연산은 i=0에서 시작하므로 while문을 통해 계산될 때 num이 짝수라면 반복 연산을 통해 odd값으로 false를, num이 홀수라면 odd값으로 true를 반환한다. 엥 근데 쓰면서 다시 코드 보니까 if문 필요 없었다........................ 그냥 바로 return odd;로 끝냈으면 됐는뎁쇼? 하

아무튼 처음엔 코드를 이렇게만 작성하고 다 됐다! 했는데 결과는 오답이었다 ^.^ 한숨 쉬면서 다시 보니까 i=0으로 초기화를 해주었는데 만약 num으로 음수값이 들어온다면 while문 조건에 부합하지 않고 그대로 odd의 초기값인 true를 반환하는 문제가 있었다.

if(num<0){
    num *= -1;
}


그래서 num에 -1을 곱해 양수로 만들어 주는 연산을 while문 앞에 추가했고 풀이에 성공했다.

개선 방안


1. 일단 제일 간단한 것부터 시작해보자면 작성한 처음 if문은

if(num<0) {
    num = -num;
}


으로 작성할 수 있다. 사실 성능에 크게 차이가 있는지는 모르겠지만 더 간단해 보인다,,,,, 아님 말고여,, 그리고 오늘 알았는데 if문에서 실행할 문장이 하나뿐이라면 {} 블록을 생략할 수도 있다!

if(num<0) num = -num;


따라서 위의 코드는 이렇게도 작성 가능하다.

2. 위에서도 말했지만 마지막 if문 필요 없었다....... 그냥 while문 밖에서 바로 odd 값을 리턴해주면 됐다.

return odd;

다른 풀이 방안


while문 조건을 다르게 주어 풀 수도 있다.

while(num>0){
    if(num==1){
    	return true;
    }
    num -= 2;
}
return false;


while문으로 들어오는 num의 값이 1이 될 때까지 2씩 빼주는 연산을 계속하다가 num==1(즉, 홀수)이 되는 순간 true 값을 리턴한다. 나머지의 경우(num이 짝수인 경우) false를 리턴하게 되는 구조.