Problem Solving/Algorithm Concepts

[Programmers] Level1 자연수 뒤집어 배열로 만들기

대범하게 2022. 8. 1. 21:31
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/12932

* 문제 설명

프로그래머스 Level1 자연수 뒤집어 배열로 만들기

 

자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴

예를 들어, n이 12345이면 [5, 4, 3, 2, 1]을 리턴

* 접근 포인트

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

- 제한 조건

  • n은 10,000,000,000이하인 자연수입니다.

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

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

 

* 소스코드1

1. 숫자를 쪼개기 힘들기 때문에 문자열로 변환

숫자를 문자로 변환은 생각보다 간단하다........!

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

(long n = 12345 이었으면,  String str = 12345; 문자열이 된다.)

 

2. 문자열을 쪼개서 배열로 저장

strArr라는 배열을 선언한 후, str 문자열을 split()을 이용해 쪼개어 배열에 넣는다.

split() 메소드는 String에서만 사용되고, 마침표나 슬래쉬 등 기호를 기준으로 값을 쪼갤 수 다.

이 문제에서는 모든 글자를 쪼개기 때문에 split("")을 사용한다.

 

3. 배열의 순서를 뒤집어 출력

배열의 길이는 변함이 없고, 당연히 로직이 반복되기 때문에 for문을 사용한다.

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

i = 0일 때, strArr[0]는 리턴할 배열[4]를 보내주고

...

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

=> strArr[i]는 리턴할 배열[4-i]를 보내준다.

class Solution{
    
	public int[] solution(long n) {
		// 입력값 long n = 12345
		String str = new String(n + "");	// 문자열 str = 12345
		String strArr[] = str.split("");	// 문자열 배열 strArr = [1, 2, 3, 4, 5]
		
		int answer[] = new int[strArr.length];	// 배열의 길이로 answer 크기 정함

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

		return answer;
	}
}

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

문제 자체가 public int[] solution(long n) {}으로 주어졌기 때문에, 리턴할 배열은 데이터 타입은 int로 선언한다.

 

 

하지만, 여기서 모든 자연수의 길이가 5가 아니기 때문에 strArr.length - 1로 바꿔준다.

또, 리턴할 배열 answer의 데이터 타입이 int인데 strArr는 String 배열이기에 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;
	}
}

 

* 소스코드2

1. 숫자를 문자열로 바꿈

(위의 내용과 문자열 바꾸는 방법은 동일하다.)

숫자를 문자로 변환은 생각보다 간단하다........!

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

(long n = 12345 이었으면,  String str = 12345; 문자열이 된다.)

 

2. StringBuilder의 reverse() 메소드 사용해서 뒤집기

StringBuilder도 문자열을 다루는 클래스이다. 문자열을 다루는 메서드(reverse(), append))이 많다.

Q. String이 있음에도 StringBuilder를 왜 쓰는가?

String은 더하는(+) 행위나 replace 했을 경우 새로운 객체가 생성되어 메모리 할당과 해제를 발생시켜 연산이 많아지기 때문에 성능적으로 좋지 못 하다.

StringBuilder는 객체 하나로 가능! 즉, String 처럼 여러 개를 안 만들어도 된다.

StringBuilder sb = new StringBuilder();		// StringBuilder 객체 생성
sb = sb.reverse()		// reverse() 메소드로 값을 뒤집는다.

 

3. 문자를 쪼개서 String 배열에 저장

String[] arr = sb.toString().split("");
// toString()이 쓰이는 이유는??????????

 

4. 문자를 int형으로 바꿔서 배열 출력

문제에서 "각 자리 숫자를 원소로 가지는 배열"이라고 했기에 형변환을 해줘야한다.

String을 int형으로 바꾸는 방법은 Integer.parseInt(Stirng값)

이미 위에서 뒤집었기 때문에 순서대로 출력하면 원하는 결과값이 출력된다.

 

class Solution{
	public int[] solution(long n){
		String s = n + "";	// 숫자열 n을 문자열 n으로 바꿈
		StringBuilder sb = new StringBuilder(s);
		sb = sb.reverse();	// 뒤집기
		String[] arr = sb.toString().split(""); 
	
		int[] answer = new int[arr.length];	// 배열의 길이는 length

		for(int i=0; i<arr.length; i++){
			answer[i] = Integer.parseInt(arr[i]);
		}
		return answer;
	}   
}

 

[참고]

https://nyadvlp.tistory.com/10