본문 바로가기

프로그래머스 코딩(자바)/Level 0

Programmers Level 0 - 짝수는 싫어요

728x90
  • 짝수는 싫어요
문제 설명

정수 n이 매개변수로 주어질 때, n 이하의 홀수가 오름차순으로 담긴 배열을 return하도록 solution 함수를 완성해주세요.

 
제한사항
  • 1 ≤ n ≤ 100

입출력 예nresult

n result
10 [1, 3, 5, 7, 9]
15 [1, 3, 5, 7, 9, 11, 13, 15]

입출력 예 설명

입출력 #1

  • 10 이하의 홀수가 담긴 배열 [1, 3, 5, 7, 9]를 return합니다.

입출력 #1

  • 15 이하의 홀수가 담긴 배열 [1, 3, 5, 7, 9, 11, 13, 15]를 return합니다.

[ 풀이 1 ]

1
2
3
4
5
6
7
8
9
10
11
public class Solution {
    public int[] solution(int n) {
        int length = n/2;
        if(n%2==1length++;
        int[] answer = new int[length];
        for (int i = 0; i < answer.length; i++) {
            answer[i] = (i + 1* 2 - 1;
        }
        return answer;
    }
}
cs
일단 제일 먼저 구해야 하는 것이 홀수들의 개수이다.
그런데 n 값에 따라 홀수의 개수가 달라진다.
10 이면 10/2 = 5 ---1, 3, 5, 7, 9 이렇게 5개가 되지만
15이면  15/2 = 7  + 1 --- 1, 3, 5, 7, 9, 11, 13, 15 이렇게 8개가 된다. 
그렇다면 answer배열의 크기는 어떻게 구할까?
주어지는 n값이 홀수인지 짝수인지를 구해서 짝수이면 나누기 2를 홀수이면 나누기 2 더하기 1을 해야 한다.

3항 연산자를 이용한 식으로 표현하면
int length = n%2==0 ? n/2 : n/2+1;

뭔가 냄새가 난다.  n/2가 두번이나 들어갔다.
좀더 좋은 코드는 없을까? 
int length = n/2;
if(n%2==1) length++; // 홀수 일때만 +1을 더해준다.

그래도 냄세가 난다. 배수가 아닐때만 +1을 해준다.
그렇다면  넘어온 수에서 1을 빼준 수를 만들고 나누기를 한다음 무조건 + 1을 해줘도 되지 않을까?
(10-1) / 2 + 1 = 9 / 2 + 1 = 4 + 1 = 5
(15-1) / 2 + 1 = 14 / 2 + 1 = 7 + 1 = 8

와~~~~ 이렇게 하면 되곘구나 하하하하하..... 아래의 풀이처럼 조건문을 사용하지 않고 배열의 크기를 구할 수 있다.

 

[ 풀이 2 ]

1
2
3
4
5
6
7
8
9
class Solution {
    public int[] solution(int n) {
        int[] answer = new int[(n-1)/2+1];
        for(int i=0;i<answer.length;i++){
            answer[i] = (i+1)*2-1;
        }
        return answer;
    }
}
cs

 

두 번째로 구해야 하는 것은 만든 배열에 홀수를 채워 넣는것이다.

i 변수값   넣은 홀수 값 
0              1
1              3
2              5
.
.
.

뭔가 규칙이 있는것 같은데 규칙을 찾아보자

(0 + 1) * 2 - 1  = 1 - 2 - 1 = 2 - 1 = 1
(1 + 1) * 2 - 1 =  2 * 2 - 1 = 4 - 1 = 3
(2 + 1) * 2 - 1 =  3 * 2 - 1 = 6 - 1 = 5

계산식이 나왔다.
(i + 1) * 2  - 1 이면 된다.

0 1 2 3 4 5 가 1 3 5 7 9로 바뀌게 된다.

그래서 배열크기만 큼 반복하면서  배열에 i(index)를 이용하며 홀수를 만들어 넣어 주었다. 

 

728x90