Day 13 문자열, 배열, 사칙연산, 수학, 조건문
Day13 13단계 20231101
1. 컨트롤 제트
- 내 풀이 : str을 String 배열로 분리시킨 후, 요소들을 확인해서 Z라면 직전 위치의 값을 전체 총 합에서 빼고, 아니면 계속 더하는 식으로 진행
class Solution {
public int solution(String s) {
String[] str = s.split(" ");
int minus = 0;
int answer = 0;
for (int i = 0; i < str.length; i++) {
if (str[i].equals("Z")) {
answer -= Integer.parseInt(str[i-1]);
continue;
}
answer += Integer.parseInt(str[i]);
}
return answer;
}
}
- 다른 사람 풀이 : str을 String 배열로 만든 다음, 각 요소를 Stack에 넣었다. 만약 배열의 요소가 Z라면, 가장 마지막에 넣은 숫자를 배열에서 제거(pop())한다.(Z 직전 값을 빼는 것이다). Z와 같지 않다면 계속해서 요소를 추가하고, 마지막에 Stack에 있는 모든 값을 더한다.
- 나중에 List 인터페이스#3. Stack을 사용할 때 참고할 것.
import java.util.*;
String str = "1 2 Z 3";
int answer = 0;
Stack<Integer> stack = new Stack<>();
for(String s : str.split("")) {
if(s.equals("Z")) { stack.pop(); }
else { stack.push(Integer.parseInt(s)); }
}
for(int i : stack) { answer += i; }
2. 배열 원소의 길이
- 내 풀이 : String 배열의 길이와 동일한 int 배열을 만들고, int 배열의 요소는 String 배열 요소의 길이를 저장했다.
class Solution {
public int[] solution(String[] strlist) {
int[] answer = new int[strlist.length];
for (int i = 0; i < strlist.length; i++) {
answer[i] = strlist[i].length();
}
return answer;
}
}
- 다른 사람 풀이 : Stream에서 String의 길이를 바로 받아 배열로 저장하는 방법도 있다.
- 지금껏 mapToIntintValue만 사용했었는데, 변환할 데이터 타입과 메소드를 잘 조합하면 더 다양한 시도를 할 수 있다는 것을 알았다.
Arrays.streamlength).toArray(;
3. 중복된 문자 제거
- 내 풀이 : ArrayList를 사용해서 my_string의 특정 위치에 문자가 List에 있는지 확인하고, 없을 때만 저장한 후 String으로 변환했다.
import java.util.*;
import java.util.stream.Collectors;
class Solution {
public String solution(String my_string) {
List<Character> list = new ArrayList<>();
for(int i = 0; i < my_string.length(); i++) {
if(!list.contains(my_string.charAt(i))) {
list.add(my_string.charAt(i));
}
}
return list.streamvalueOf).collect(Collectors.joining();
}
}
- 다른 사람 풀이 1 : 먼저 my_string을 char 배열로 만들고, stream의 mapToObjtoString)을 사용하여 char 타입 요소들을 String으로 변환한 다음, distinct( 메소드를 사용해서 중복값을 제거한 후 String으로 연결했다.
my_string.charstoString).distinct().collect(Collectors.joining()
- 다른 사람 풀이 2 : LinkedHashSet을 사용해서 중복을 제거하면서 순서를 유지하는 집합을 만들어 my_string의 중복된 문자를 제거했다.
String[] str = my_string.split("");
Set<String> set = new LinkedHashSet<String>(Arrays.asList(str));
String.join("", set);
- 다른 사람 풀이 3 : String의 indexOf()는 처음 등장한 문자열에만 return을 하기 때문에, 이를 비교해서 중복되어 나오는 문자열을 카운트/연결하지 않았다.
- i 번째 위치의 문자열의 인덱스가 현재 인덱스 i랑 같을 경우, 즉 처음 등장한 문자열인 경우에만 answer를 추가해준다.
String answer = "";
for(int i = 0; i < my_string.length(); i++) {
if (i == my_string.indexOf(my_string.charAt(i))) {
answer += my_string.charAt(i);
}
}