x 사이의 개수
다음과 같은 문제인데
import java.util.Arrays;
class Solution {
public int[] solution(String myString) {
return Arrays.stream(myString.split("x"))
.mapToInt(String::length)
.toArray();
}
}
위와 같은 코드를 통해 접근하게 되면 split("x")에서 맨 마지막 빈 배열을 포함하지 않아서 아래와 같이 테스트 1에서 실패하게 됩니다
이때 아래와 같이 -1 인수를 추가해서 작성하게 되면 문자열 끝에 위치한 구분자 뒤에 빈 문자열도 포함하게 됩니다
import java.util.Arrays;
class Solution {
public int[] solution(String myString) {
return Arrays.stream(myString.split("x", -1))
.mapToInt(String::length)
.toArray();
}
}
문자열 잘라서 정렬하기
생각보다 엄청 간단해보입니다. 문자열 x를 기준으로 split해서 sort하면 될 것 같죠?
import java.util.Arrays;
class Solution {
public String[] solution(String myString) {
return Arrays.stream(myString.split("x"))
.sorted()
.toArray(String[]::new);
}
}
테스트도 전부 통과했고, 제출하려 했는데
여기서 한가지 간과한 사실은 xx와 같이 x가 중복으로 나오는 상황에서는 아래와 같이 빈배열이 발생할 수 있다는 사실입니다
String myString = "axxbxxcxdx";
String[] result = myString.split("x");
System.out.println(Arrays.toString(result));
//출력
["a", "", "b", "", "c", "d"]
그래서 아래와 같이 filter()라는 메서드를 통해 빈배열인 경우는 제거합니다
import java.util.Arrays;
class Solution {
public String[] solution(String myString) {
return Arrays.stream(myString.split("x"))
.filter(i -> i.length() != 0)
.sorted()
.toArray(String[]::new);
}
}
간단한 식 계산하기
이 문제도 엄청 간단한 문제죠? 최대한 깔끔하게 풀어보겠습니다
class Solution {
public int solution(String binomial) {
String[] operations = binomial.split(" ");
int a = Integer.parseInt(operations[0]);
int b = Integer.parseInt(operations[2]);
String op = operations[1];
return switch(op){
case "+"-> a+b;
case "-"-> a-b;
case "*"-> a*b;
default -> throw new IllegalArgumentException("Invalid operator");
};
}
}
여기서 주목해야할 점은 Java 12 부터 도입된 switch 문의 구조입니다
원래는 아래와 같이 case 마다 : 를 사용하여 값을 처리했지만, Java 12 부터 ->를 통하여 값을 반환할 수 있습니다. 훨씬 깔끔한 코드를 작성할 수 있습니다
Java 12 이전
switch (op) {
case "+":
return a + b;
case "-":
return a - b;
case "*":
return a * b;
default:
throw new IllegalArgumentException("Invalid operator");
}
문자열 바꿔서 찾기
class Solution {
public int solution(String myString, String pat) {
StringBuilder sb = new StringBuilder(myString);
for(int i=0; i<sb.length(); i++){
if (sb.charAt(i) == 'A') {
sb.setCharAt(i, 'B');
} else {
sb.setCharAt(i, 'A');
}
}
if (sb.toString().contains(pat)) {
return 1;
}
return 0;
}
}
코딩을 배운지 얼마 안되신 분들은 다음과 같이 StringBuilder를 통해 문제를 해결하는 방법을 많이 사용하실 것 같은데, 아무래도 가독성이 좀 떨어지는 느낌이죠?
이때 우리는 replace 라는 함수를 사용할 수 있습니다
myString.replace("A", "B")는 myString 안에 존재하는 모든 A 문자열을 B로 변경하게 됩니다
class Solution {
public int solution(String myString, String pat) {
String answer = myString.replace("A", "C")
.replace("B", "A")
.replace("C", "B");
return answer.contains(pat) ? 1 : 0;
}
}
위 코드를 간소화한 방식에 대해 설명하자면, A와 B 문자열을 서로 바꿔야 하는 상황에서 임시 문자열 C를 사용하지 않으면 직접적으로 변경할 수 없습니다. 그래서 먼저 A를 임시 문자열 C로 변경한 뒤, B를 A로 바꾸고, 마지막으로 C를 B로 변경하는 방식으로 해결한 것입니다