자연수 뒤집어 배열로 만들기

SaGo_MunGcci·2022년 7월 15일
0
  • 문제

문제 접근

  • 처음 12345를 length로 생각해서 접근을 했다. 따라서
    예를 보고 12345를 5라고 생각해서 코드를 작성했다.
    따라서 길이가 5이면 5를 1씩 감소시켜서 출력하면 되는 줄 알았다.
public class Q23 {
    public int[] solutionQ23(long n) {    
    	// 즉 n== 5라고 생각하고 코드 작성	
        long examp_long = n;
        
        // int 배열로 받기위해 long에서 int로 형변환
        int example_int = (int) examp_long;
		// Long을 int[]로 담기위해서 형변환한  example_int를
        // 배열의 크기로 입력함.
        int[] answer = new int[example_int];
		
        // 
        // 길이 만큼 반복문을 실행햐서 answer에 대입.
        for(int i = 0; i<example_int; i++){

            answer[i] = example_int -i;
        }

        return answer;   
    
    
       }
}

출력은 [5,4,3,2,1]로 잘 출력됬는데 프로그레머스에서는 광탈했다.

문제 재접근

  • 아무리 생각해도 출력예시와 똑같이 나오게 되어서 반복문 구조를 다시 보고 배열의 길이를 형변환을 하는등 여러가지 시도를 하였으나 본질적으로는 로직이 같아서 계속 런타임 오류가 발생했다.

문제 해결 접근

  • 문제를 천천히 다시 읽던중 long타입이 매개변수로 받아오는 것을 보는 순간 번뜩, 어 혹시 이거 12345의 길이를 받아오는 것이 아니고 12345를 입력받아서 이걸 String으로 변환해서 문자로 출력하라는 것인가라고 접근을 해보았다.
		// int 배열로 받기위해 long에서 int로 형변환
        String example_str = String.valueOf(n);

		// 문자열 길이를 str_leng로 선언함
        int str_leng = example_str.length();
		
        // 위와 마찬가지로 길이만큼 int[] 크기를 선언함.
        int[] answer = new int[str_leng];
		
        // 문자열 길이가 옳바르게 나오는 지 확인.
        //System.out.println(example_str.length());
        
        // 맨 뒤부터 역순으로 출력하게끔 반복문을 실행.
        // 초기값이 5이면 인덱스는 4까지 이기에 초기값을 -1 만큼 선언함. 항상 조심하기.
        for(int i = str_leng-1; i>=0; i--){
			// charAt으로 문자를 나눠서 출력 해봄.
            // [1,2,3,4,5]가 출력됨.
            // System.out.println(example_str.charAt(i));
 			
            // chart -> String --> int로 형변환 시도
            // 정상 출력됨 [1,2,3,4,5]
            //System.out.println(Integer.parseInt(String.valueOf(example_str.charAt(i))));

			 
			// chart -> String --> int로 형변환한 출력을 보고 반대로 출력
            //12345이면 초기값이 4고 i = 4일때 charAt[0](==1)이 되니까
            // answer[4] == 1이됨. answer[3] == 2 answer[2] == 3 answer[1] == 4 answer[0] == 5가됨.
            // 따라서 answer[5]의 배열안은
            // 인덱스가 answer[0]부터 [4]까지 순서대로 [5,4,3,2,1]이 들어갈 것임.
            answer[i] = Integer.parseInt(String.valueOf(example_str.charAt(str_leng-1 - i)));

        }

        return answer;
  • 결과는 통과했다.

  • 일단 스스로 로직을 생각하고 알고리즘을 이해하는것도 중요하지만 문제를 정확히 이해하는 것 또한 중요하다는 것을 다시한번 깨닫게 되었다.

  • 내가 문제를 어떻게 접근하느냐에 따라서 해결할 수 있다는 것을 느끼게 되어서 뿌듯한것 같았다.(효율적인 코드를 작성해야 된다는 부담감도 느낀다.)

  • 참고로 이 문제를 1줄로 해결한 코드를 보았는데 정말 겸손해져야 겠다는 것을 느겼다. 바로 아래에 소개하겠다.

class Solution {
    public int[] solution(long n) {
        return new StringBuilder().append(n).reverse().chars().map(Character::getNumericValue).toArray();
    }
}
profile
이리저리 생각만 많은 사고뭉치입니다.

0개의 댓글