[Programmers/코딩테스트 연습] 외계행성 나이 Java (valueOf, split, Stream.of, mapToInt, mapToObj, String.chars()) Int to String, String to Int
외계행성의 나이 (Java)
int를 String으로 변환하기 #inttoString
int i = 12;
String str = String.valueOf(i);
String을 String[]로 변환하기 #StringtoStringArray
#split()
String str = "ab cd ef";
String[] arr = str.split(" "); //이 때 큰따옴표 필수!
#띄어쓰기 기준으로 분할
String str = "ab,cd,ef";
Pattern ptn = Pattern.compile(',');
String[] arr = ptn.split(str);
#정규식 패턴(콤마)를 기준으로 분할
String str = "abcdefghij";
for(int i = 0; i < str.lengh; i++) {
arr[i] = str.charAt(i);
}
#charAt()을 이용하여 한 글자씩 반환
[내 생각에는 0-a 이런식으로 매핑을 하거나 쌍을 만들어서 사용하면 될 것 같은데 stream.map을 실패했다.]
String 길이 구하기 #StringLength
String str = "abc";
int strlen = str.length();
int 길이 구하기 #intLength #math #log10
int num = 1234;
int numlen = (int)(math.log10(num) +1); // ????확인불가
math.log10()의 범위는 -2147483648 ~ 2147483647로, signed int 정수형 범위 안에서만 사용 가능하며, 결과값은 최대 10까지이다.
밑은 나의 겁나 한심하고 복잡하고 불필요한 제출 결과다.
다른 사람 코드 참고하려고 일단 통과를 목적으로 짠 아주 조잡한 코드이다.
울고싶다..
#stream 공부 열심히 한 걸로 만족하자... 덕분에 #split 이랑 #mapToInt 는 확실히 배웠다.
import java.util.Arrays;
import java.util.stream.Stream;
class Solution {
public String solution(int age) {
String answer = "";
int[] digits = Stream.of(String.valueOf(age).split("")).mapToInt(Integer::parseInt).toArray();
String[] str = "abcdefghij".split("");
for (int i = 0; i < digits.length; i++) {
answer += str[digits[i]];
}
return answer;
}
}
그리고 내가 하려다가 Java에서 String에 (char)로 강제 형변환 대입이 가능하다는 것을 몰라서 끝내 통과 못시킨 코드.. 완성본
class Solution {
public String solution(int age) {
String str = Integer.toString(age);
String answer = "";
for(int i = 0; i < str.length(); i++)
{
answer += (char)(str.charAt(i) + 49);
}
return answer;
}
}
개인적으로 이게 훨씬 더 마음에 든다.
그리고 많은 사람들이 제출한 심플한 코드가 있다.
return String.valueOf(age).chars().mapToObj(operand -> String.valueOf((char) (49 + operand))).collect(Collectors.joining());
return값에 바로 들어간 것도 그렇고 한눈에 딱 들어오지 않아서 별로인 것 같은데 이게 좋다는 걸 보니 공부해야지 뭐 어쩌겠어..
1) age를 String.valueOf()를 이용해 string으로 변환
2) chars() : String.chars() 는 mapToObj와 함께 사용된다.
3) mapToObj : String.chars().mapToObj(i -> (char)i) 라고 하면, String의 각각 char를 stream으로 만든다. (분할)
4) mapToObj(operand -> String.valueOf((char)(49 + operand))) : char형태가 된 숫자를 아스키 코드의 16진수와 일치하도록 49를 더한 뒤 char 형태로 변환한다.
5) collect(collectors.joining()) 은 아무래도 합쳐서 반환하는거겠지 뭐.
아 어려웠다!