일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 프로그래머스
- 자바
- 월간코드챌린지
- Linux
- GoingBus
- 리눅스마스터1급
- 개발자 회고록
- 코딩테스트
- Kotlin
- 리눅스마스터 1급 정리
- 리눅스마스터 3과목
- 명령어
- map
- 리눅스
- 고잉버스
- 백준 java
- toCharArray
- 스프링 빈
- Java
- Memoir
- 백준 javascript
- 문자열
- JavaScript
- 자바스크립트 코딩의 기술
- 스프링 컨테이너
- 카카오
- java 백준 1차원 배열
- 반복문
- 코테
- 연습문제
- Today
- Total
hoon's bLog
Java 프로그래머스 정수 내림차순으로 배치하기 자바 본문
문제 출처 : https://school.programmers.co.kr/learn/courses/30/lessons/12933
[문제 설명]
함수 solution은 정수 n을 매개변수로 입력받습니다.
n의 각 자릿수를 큰 것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요.
예를 들어 n이 118372면 873211을 리턴하면 됩니다.
[제한 조건]
- n은 1이상 8000000000 이하인 자연수입니다.
[입출력 예]
n | return |
112378 | 873211 |
[먼저 생각해 보기]
자연수를 어떻게 조작하여, 형변환 or 수학을 통한 규칙을 이용한 로직으로 풀 것인가?
필자는 자연수를 문자열로 형변환 하는 방식을 선택했다!
[나의 풀이]
import java.util.Arrays;
class Solution {
public long solution(long n) {
char[] ch = String.valueOf(n).toCharArray();
Arrays.sort(ch);
return Long.parseLong(new StringBuilder(new String(ch)).reverse().toString());
}
}
먼저 입력받은 자연수를 String.valueOf를 통해 자연수를 문자열로 바꾸고,
toCharArray()로 문자배열로 저장! Arrays.sort()로 오름차순으로 정렬!
int의 범위는 -2,147,483,648 ~ 2,147,483,647
long의 범위는 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
문자열 배열을 StringBuilder와 String 객체 선언을 해준 후 역순정렬 하여,
return 타입은 long 반환을 위해 Long.parseLong으로 Parsing!!
[다른 사람들의 풀이]
public class ReverseInt {
public int reverseInt(int n){
//return할 변수, ten은 10씩 곱할 변수, tmp_num은 전달된 n값 가지는 임시변수, n의 자리수 알아내는 count
int total_reverse=0, ten=1, tmp_num=n, count=0;
int i=0;
//tmp_num이 0이 아닐 때까지 반복
while(tmp_num!=0) {
count++; //count갯수 증가
tmp_num = tmp_num / 10; //다음 자리수를 알기 위해 10으로 나눈 값을 tmp_num에 저장
}
tmp_num = n; //다시 n값을 tmp_num에 저장
int arr[] = new int[count]; //count크기만큼의 배열 생성
//tmp_num이 0이 아닐 때까지 반복
while(tmp_num!=0) {
arr[i] = tmp_num % 10;
tmp_num = tmp_num / 10;//10으로 나눈 나머지 값을 저장했으니 다음 자리수를 알기 위해 10으로 나눈 값을 tmp_num에 저장
i++;//인덱스 값 증가
}
//내림차순 -> 큰수부터 작은수로 내려감
for(i=0; i<arr.length; i++)
for(int j=i+1; j<arr.length; j++)
if(arr[i]<arr[j]) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
//맨 마지막 인덱스인 arr.length-1부터가 1의 자리 수이므로
for(i=arr.length-1; i>=0; i--) {
total_reverse += arr[i] * ten;//total_reverse에 arr[i]*ten한 값을 계속 더하기
ten = ten * 10;//1의 자리 수부터 계산하였으므로 점차 올라가니까 10씩 곱해주기
}
return total_reverse;
}
// 아래는 테스트로 출력해 보기 위한 코드입니다.
public static void main(String[] args){
ReverseInt ri = new ReverseInt();
System.out.println(ri.reverseInt(118372));
}
}
클래스를 생성하여 수학적 로직을 이용하여, 메서드를 생성한 풀이다.
이 코드는 가독성은 다소 떨어질 수 있으나,
형변환을 하지 않고도 문제를 풀이한다는 센스를 배울 수 있었다!
[정리]
개인 피셜 난이도 : ★★☆☆☆
어찌 보면 쉽다!라고 생각 할 수 있지만, 처음엔 생각보다 머리가 잘 안 돌아간다.
때에 따라서 형변환하는 풀이가, 수학적인 풀이가 효율적일 수 있음을 인지하고,
상황에 맞게 코딩하는 것이 굉장히 중요하다.
그리고 요구되는 데이터의 반환값은 되도록이면 맞춰주는 것이 좋다.
문제 예제만 풀기 급급하다 보면, 내가 생각지 못한 케이스에 발목 잡힐 일이 많다.
특히 실무에서도 나는 해결했다고 하지만, 실제로 내가 코딩하면서,
테스트하지 못한 케이스가 정말 많이 나온다...
이걸 줄여 나가려면, 계속 다양한 조건과 방법들을 구상하고 코딩하는 수밖에...ㅎㅎㅎ
어쨌든 오늘 미션도 클리어!
언제나 새로운 정보 공유와 잘못된 정보
비판/지적/태클은 환영입니다!
끝.
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
Java 프로그래머스 제일 작은 수 제거하기 자바 (0) | 2023.02.09 |
---|---|
[Java] 프로그래머스 정수 제곱근 판별 자바 (6) | 2023.02.08 |
Java 프로그래머스 자연수 뒤집어 배열로 만들기 자바 (2) | 2023.02.06 |
[Java] 프로그래머스 문자열 내림차순으로 배치하기 자바 (4) | 2023.02.01 |
Java 프로그래머스 문자열 내 p와 y의 개수 자바 (0) | 2022.09.14 |