프로그래머스의 알고리즘 문제 및 풀이에 대해 차근차근 포스팅하려합니다.
저도 초보자이기도하고 알고리즘에 쉽게 다가갈 수 없는 부분들이 많기 때문에
최대한 알기 쉽게 정리해보려하고 알고리즘을 어려워하는 분들에게 도움이 되었으면 합니다.
많이 공유되고 토론이 될 수 있는 공간이 되었으면 좋겠습니다.
환경
언어 : 자바
단계 : 레벨 1단계 (입문자용)
정답률 : 86%
제목
정수 제곱근 판별
문제 설명 및 코드
함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.
- n은 1이상 8000000000 이하인 자연수입니다.
1
2
3
4
5
6
7
|
class Solution {
public long solution(long n) {
long answer = 0;
return answer;
}
}
|
cs |
입출력 예
n | return |
118372 | 873211 |
문제 정답 코드
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
|
class Solution {
public long solution(long n) {
long answer = 0;
String strArr = Long.toString(n);
int[] intArr = new int[strArr.length()];
for(int i=0; i<strArr.length(); i++){
intArr[i] = strArr.charAt(i) - '0';
}
for(int i=0; i<intArr.length; i++){
for(int a=i+1; a<intArr.length; a++){
if(intArr[i] < intArr[a]){
int tmpVal = intArr[i];
intArr[i] = intArr[a];
intArr[a] = tmpVal;
}
}
}
StringBuilder strBld = new StringBuilder();
for(int intVal : intArr){
strBld.append(Integer.toString(intVal));
}
answer = Long.parseLong(strBld.toString());
return answer;
}
}
|
cs |
우선 Long타입의 임의의 수를 String 변수에 담습니다.
int 배열을 선언한 다음
반복문을 통해서 int 배열인 intArr에 charAt메서드를 통해 담아줍니다.
그리고 이중 반복문으로 intArr를 활용해서 선택정렬을 통해 내림차순을 해줍니다.
맨 앞부터 값을 확인해 나가면서 위치를 교체하는 방식입니다.
a반복문이 크다면
i반복문의 값을 임시저장소인 tmpVal에 담고
a값을 i로 저장한 다음
tmpVal에 담았던 i값을 a에 담아주는 방식입니다.
그럼 내림차순이 형성되겠죠.
그 후에 StringBuilder 를 이용하여 하나하나씩 문자열로 변환하여 문자를 붙여줍니다.
그리고 마지막에 Long타입으로 형변환 후 return 하게 되면 완료입니다.
참고로
만약 오름차순을 구현하려면
if(intArr[i] > intArr[a]){
내림차순의 if(intArr[i] < intArr[a]){ 이 부분을 부등호만 첫번째 반복문의 인덱스로 향하게 하면
오름차순을 구현할 수 있습니다.
다른사람 풀이
1
2
3
4
5
6
7
8
9
10
11
|
import java.util.*;
class Solution {
public long solution(long n) {
return Long.parseLong(String.valueOf(n).chars().mapToObj(ch -> (char) ch)
.sorted(Comparator.reverseOrder())
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
.toString());
}
}
|
cs |
여기서는 함수에 람다식을 더하여 짧게 마무리 한 코드입니다.
풀이를 하자면
long의 값을 string으로 변환 후
자바 7에서의 charAt() 처럼 String 값을 하나하나 꺼내기 위해 chars().mapToObj를 해줍니다.
Comparator.reverseOrder()를 통해서 역순으로 돌린다음
collect과 StringBuilder로 문자열을 붙여준 후,
마지막으로 Long 타입으로 변환해주면 끝입니다.
성능은 떨어질 순 있지만 정말 깔끔한 코드네요.
'Algorithm' 카테고리의 다른 글
[Java&알고리즘] 하샤드 수 (Level 1) (0) | 2023.03.03 |
---|---|
[Java&알고리즘] 나머지가 1이 되는 수 찾기 (Level 1) (0) | 2023.03.02 |
[Java&알고리즘] 정수 제곱근 판별 (Level 1) (0) | 2023.02.24 |
[Java&알고리즘] x만큼 간격이 있는 n개의 숫자 (Level 1) (0) | 2023.02.23 |
[Java&알고리즘] 문자열 내 p와 y의 개수 (Level 1) (0) | 2023.02.21 |
댓글