문자열 다루기 기본
💡 문제 설명
문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.
제한 사항
- s는 길이 1 이상, 길이 8 이하인 문자열입니다.
- s는 영문 알파벳 대소문자 또는 0부터 9까지 숫자로 이루어져 있습니다.
입출력 예
s return
"a234" | false |
"1234" | true |
나의 코드
import java.util.*;
import java.util.stream.*;
class Solution {
public boolean solution(String s) {
if(s.length() == 4 || s.length()== 6){
try{
Stream.of(s).mapToInt(Integer::parseInt).toArray();
return true;
}catch (NumberFormatException e){
return false;
}
}
return false;
}
}
stream으로 int [] 로 변환했을때 numberFormatException이 뜨면 string의 문자열이 온전히 숫자가 아니므로 try-catch로 값을 변환시켰다.
문자 길이의 제한이 있다는것을 알지 못해서 헤매었다.
다른코드1
class Solution {
public boolean solution(String s) {
if(s.length() == 4 || s.length() == 6){
try{
int x = Integer.parseInt(s);
return true;
} catch(NumberFormatException e){
return false;
}
}
else return false;
}
}
stream만 생각하니 단순히 s를 Integer.parseInt할수있다는것을 잊었다.
그 외 기본적인 흐름은 나와 같은것같다.
다른코드2
public boolean solution(String s) {
return (s.length() == 4 || s.length() == 6) && s.chars().allMatch(Character::isDigit);
}
allMatch() 는 스트림의 모든 요소가 해당조건을 만족하는 경우 true를 반환
조건문을 제시할수도 있다
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
boolean allLessThanTen = numbers.stream().allMatch(n -> n < 10);
문자열 내림차순으로 배치하기
💡 문자열 내림차순으로 배치하기
문제 설명
문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.
s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.
제한 사항
- str은 길이 1 이상인 문자열입니다.
입출력 예
s return
"Zbcdefg" | "gfedcbZ" |
나의 코드
import java.util.*;
import java.util.stream.Collectors;
class Solution {
public String solution(String s) {
String[] split = s.split("");
List<String> collect = Arrays.stream(split).sorted().collect(Collectors.toList());
Collections.reverse(collect);
StringBuilder stringBuilder = new StringBuilder();
for (String answer : collect) {
stringBuilder.append(answer);
}
return stringBuilder.toString();
}
}
개선 코드
import java.util.*;
import java.util.stream.*;
class Solution {
public String solution(String s) {
return Stream.of(s.split(""))
.sorted(Comparator.reverseOrder())
.collect(Collectors.joining());
}
}
Stream을 이런식으로 따로 호출할수있는줄 몰랐다.
그리고 stream에서 다로 역정렬이 가능한지 몰랐다.
joining은 문자열을 합치는것.
코딩테스트를 풀면서 stream 범용적으로 많은 작업을 수행할수있다는것을 느낀다.
하지만 불변객체이기 때문에 메모리 효율은 떨어진다.
다른코드1
public String reverseStr(String str){
char[] sol = str.toCharArray();
Arrays.sort(sol);
return new StringBuilder(new String(sol)).reverse().toString();
}
tocharArray를 사용하여 정렬을하고 Stringbuilder에 넣고 역정렬하여 반환했다.
나는 .split(””) 을 하여 StringBuilder에 넣으려니 파라미터가 맞지 않아서 어려웠는데, toCharArray를 하면 반환형이 String[] 가 아닌 char[] 라서 쉽게 가능하다.
오늘의 학습 :
- Stream.of() 는 배열이나 항목을 스트림으로 전환한다.
- sorted(Comparator.reverseOrder())는 역순으로 정렬한다.
- Collectors.joining()은 스트림의 모든 문자를 문자열로 합친다.
- StringBuilder에서는 reverse()는 가능하지만 sort같은 정렬기능은 없다.
- split(””) 은 String[] 를 리턴하므로 StringBuilder에 사용하기에는 적합하지 않다.
- toCharArray()를 사용하면 반환형이 char[] 이다. 이는 StringBuilder에서 사용이 가능하다.
- String이 반환형일때는 StringBuilder로 반환해도 괜찮다.
- 스트링객체.chars() 는 intStream 객체를 반환
- allMatch(조건) 는 스트림 요소 중 모든 요소들이 조건에 부합해야 참을 반환