개발/Java

자바 알고리즘 - 자연수를 뒤집어 배열로 만들기

냐냐_ 2021. 3. 31. 21:54

오늘은 자바 알고리즘 풀이!

 

자바에서, 자연수 n을 뒤집어, 각 자리 숫자를 원소로 가지는 배열을 만들어 리턴하자.
예를 들어,
n = 12345 일 때 ▶ [5, 4, 3, 2, 1] 리턴
n = 135 일 때 ▶ [5, 3, 1] 리턴


* 단, n은 10,000,000,000이하

 

class Solution{
    
	public int[] solution(long n) {

		

		return answer;
	}
}

 

수많은 블로그에 이미 풀이법이 많이 나와 있지만

내게 가장 익숙한 방식을 정리해두려고 한다!

 

 

 

 

 

접근 포인트

 

1) 자연수 n의 자릿수에 구애받지 않고 성립해야 한다

2) 숫자열을 배열로 쪼개야 한다

3) 숫자열의 순서를 뒤집어야 한다

 

 

 

 

숫자열을 배열로 쪼개기

 

데이터타입이 int일 때에는 쪼개기 힘드니까,

문자열로 변환한 후 쪼개자!

 

class Solution{
    
	public int[] solution(long n) {

		String str = new String(n + "");
		String strArr[] = str.split("");
		


		return answer;
	}
}

 

문자로 변환은 아주 간단하다!

new String을 선언한 후, 파라미터로 입력받은 n과 텅 빈 값("")을 붙이면(+) 된다.

(long n = 12345라고 가정했을 때, String str=12345 문자열이 된다.)

 

그 후 strArr라는 문자 배열을 선언한 후, 문자열로 바꿔 놓은 str을 쪼개어 넣는다.

split( ) 메소드는 마침표라던가, 슬래쉬라던가 등등 기호를 기준으로

값을 쪼갤 때 사용하는 녀석인데,

그냥 모든 글자를 쪼개고 싶을 땐 텅 빈 값("")을 기준으로 쪼개면 된다는 것을 알게 됐다!

(String strArr[] = [1, 2, 3, 4, 5] 가 된다.)

 

 

 

 

 

배열 순서 뒤집기

배열의 길이는 변함이 없다는 점에 착안하고,

당연히 로직이 반복될 테니 가장 만만한 for문을 써 준다.

코린이인 나는 이럴 때 표를 그려서 정리하며 푸는 편이다.

 

1) long n = 12345 이고

2) i=0 부터 출발

3) 배열의 길이 = 5

 

i값 strArr[i] 값
(쪼개어 놓은 배열)
몇 번째 인덱스로 보낼까?
(만들어야 하는 배열)
0 1 4
1 2 3
2 3 2
3 4 1
4 5 0

 

매직아이처럼 표를 들여다보면 규칙이 보인다!

배열의 길이에서, strArr 인덱스 값을 빼면,

몇 번째 인덱스로 보내야 하는지 규칙이 나온다.

 

i=0 일 때, strArr[0]는 리턴할 배열[4]로 보내준다.

...

i=4 일 때, strArr[4]는 리턴할 배열[0]로 보내준다.

strArr[i]를 리턴할 배열[4-i]로 보내준다!!!

 

 

 

 

class Solution{
    
	public int[] solution(long n) {

		String str = new String(n + "");
		String strArr[] = str.split("");
		
		int answer[] = new int[strArr.length];

		for (int i=0; i<strArr.length; i++) {
			answer[i] = strArr[4 - i];
		}

		return answer;
	}
}

 

그러면 이런 for문이 완성된다.

우선 리턴할 배열을 선언하는데, 길이는 미리 쪼개 둔 strArr[ ] 와 맞춰 준다. (strArr.length)

문제 자체가 public int[] solution(long n) { } 로 주어졌기 때문에,

리턴할 배열의 데이터타입은 int로 선언한다.

 

for문은 위 표에 따라 i=0 부터 출발하여 1씩 증가시키고,

리턴할 배열(answer[i])에는 strArr[4-i]값을 순서대로 넣어 주면 위 코드가 되는데...

위 코드에는 두 가지 문제가 있다.

 

 

 

 

 

1) 모든 n이 5자리인 것은 아니다. 그러므로 4라는 상수를 쓰면 안 된다.

2) 리턴할 배열 answer의 데이터 타입은 int인데, strArr는 String 배열이다.

 

어떻게 해결할까?

1) 5자리의 자연수 n이 주어졌을 때 4라는 상수가 나온 것이므로

   상수 대신 strArr.length - 1 로 바꿔 주면 된다.

2) Integer.parseInt( )를 통해 형변환을 해 주면 된다.

 

 

 

 

 

최종 코드

 

class Solution{
    
	public int[] solution(long n) {

		String str = new String(n + "");
		String strArr[] = str.split("");
		
		int answer[] = new int[strArr.length];

		for (int i=0; i<strArr.length; i++) {
			answer[i] = Integer.parseInt(strArr[strArr.length - 1 - i]);
		}

		return answer;
	}
}