[Programmers/코딩테스트 연습] 외계행성 나이 Java (valueOf, split, Stream.of, mapToInt, mapToObj, String.chars()) Int to String, String to Int

2022. 12. 3. 20:24IT/Programmers

728x90
반응형

외계행성의 나이 (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()) 은 아무래도 합쳐서 반환하는거겠지 뭐.

 

 

아 어려웠다!

728x90
반응형