자바 초급문제로 맨땅에 해딩하기

자바 초급문제 5. 같은 숫자는 싫어

Jungsoomin :) 2020. 3. 27. 02:11

프로그래머스(https://programmers.co.kr/learn/courses/30/lessons/12906)

자바 +  초급문제의 같은 숫자는 싫어 이다.

 

상당히 난해하고...무언가 반복문을 써야할 듯하면서 인덱스를 비교해 줘야할 듯 하면서 if문을 써야할 듯하면서...

 

마지막 숫자는 어떻게 하나...하면서 상당히 골머리를 썩었다. 한 5h정도 걸린 듯 하다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package programmers_같은숫자는싫어;
 
public class Exam {
    public int[] solution(int []arr) {
        int[] answer = {};
        int o =0;
        // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
        
        forint i=0; i<arr.length; i++ ) {
            
            if(arr[i] !=arr[i+1] ) {
                answer[o] = arr[i];
                o++;
                /* i를 검사할때 다음수가 다르면 o에 넣고 o를 증가시켜서
                 * 인덱스 값을 다음 인덱스로 돌린다.
                 */
            if(i == arr.length && arr[i]==arr[arr.length] ) {
                o++;
                answer[o] = arr[arr.length];
                return answer;
            }
            }
            
        }
        
        
        return answer;
    }
}
cs

 

긴 문장은 아니지만 여러모로 돌려보면서 오랜시간 삽질을 했다.

 

그러다가 아...모르겠다 죽을 것 같애..하면서 정보를 긁어모으다가 홈페이지에서 정답과 스치듯 마주치게 되었고(?)

 

'이왕 봐버린거 코드 해석을 열심히 하자!' 라고 마음먹은 난 감탄할 수 밖에 없었다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package programmers_같은숫자는싫어;
import java.util.*;
public class exam2 {
 
    public int[] solution(int []arr) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        /*ArrayList
         *  클래스(객체) integer 형 배열 생성
         *  새로운 객채로 생성 이 배열에 요소를 넣으려면 
        * 생성배열이름.add.();메소드사용
        * 특정인덱스의 요소를 삭제하려면 생성배열이름.remove(인덱스넘버);
        * 특정인덱스의 요소를 가져오려면 생성배열이름.get(인덱스넘버);
        */
        int a =10;//10으로 시작되는 수를 막기위한 변수
        forint i = 0; i<arr.length; i++ ) {
            //arr의 길이만큼 도는 i반복문
            if( arr[i] != a ) {
                /*첫 수 i가 10이 아닐때 시작.
                 * 만족하면 .add()메소드로 i=0이니 
                 * arr[0]을 list의 인덱스값으로 저장하며 스타트
                 * 그리고 a에 arr[0]을 줌으로서 다음 수 i=1일때 와 자동비교하게끔
                 * 설정했다.
                 * 즉, 첫수를 저장하고서 다음 숫자와 비교하게끔 만드는 것.
                 */
                list.add(arr[i]);
                a = arr[i];
            }
        }
        /*이후 answer에 int[]객체를 새로 만들고  = list.size()로 초기화하여
         * 인덱스 공간 확보.  
         */
       int[] answer = new int[list.size()];
       /*for문을 확보한 list의 인덱스 값만큼 돌려서 반복시키고
        * 0~list.size-1 의 횟수만큼  answer의 인덱스에 
        *list.get(i)로 인덱스요소를 전부 가져와서 대입한다.
        */
       
       forint i=0; i<list.size(); i++ ) {
           answer[i] = list.get(i);
       }
       //이 과정이 끝나면 리턴!
        return answer;
    }
    
 
}
cs

이렇게 깔끔한 사고가 있을 줄이야! 싶다.

새로운 배열을 깔아놓고 10을 기준으로 시작해 그 수를 비교 하고 또 그에 저장해가며 다음 수와 자연스레 중복여부를 확인하고 계셨다.

그 순간 뒷자리 수에 대한 고민은 없애놓고 시작하신 것이다...보고선 바로 "와...."라고 말했다.

앞자리는 정해놨고 뒷자리 수를 기준으로 판단하니까  2개의 기준을 잡아놓고 다른 수를 list에 집어넣으신 것 같더라.

간결해서 놀랬고 이렇게 연산할 수도 있음에 놀랐다.

 

그 후 answer 값에 list의 인덱스 만큼 늘려주고 그 안에 for문을 사용하셔서 answer의 각 인덱스 값에 list의 인덱스 값을

대입해 주신다.

 

그리고 깔끔하게 리턴. 왠지 리턴도 멋져보인다.

 

놀랍다. 초보자인 나에겐 정말 큰 충격이였다.

 

뭐라고 해야하나...이게 놀랍고 미묘하고 감탄스럽고 아쉬운 이 기분을.

 

나중에 익숙해질 때가 되면 나도 다시 한번 도전해서 점수를 받아보겠다.!