Day 15 문자열, 해시, 배열, 수학
Day15 15단계 20231103
1. 영어가 싫어요
- 내 풀이 : String[][]에 숫자 영단어 String와 숫자로 바꿀 내용을 저장하고, numbers에 숫자 영단어 포함 여부를 확인한다. 일치하는 패턴이 있으면 숫자로 바꾼 뒤 Long으로 변환한다.
class Solution {
public long solution(String numbers) {
String[][] change = {{"zero", "0"}, {"one", "1"},{"two", "2"},{"three", "3"},{"four", "4"},{"five", "5"},{"six", "6"},{"seven", "7"},{"eight", "8"},{"nine", "9"}};
for(String[] st : change) {
if(numbers.contains(st[0])) {
numbers = numbers.replaceAll(st[0], st[1]);
}
}
return Long.parseLong(numbers);
}
}
- 다른 사람 풀이 : String 배열을 굳이 2차로 만들지 않고 for문의 index를 1씩 증가시키는 i를 사용해서 i값을 이용해 대체해도 된다.
2. 인덱스 바꾸기
- 내 풀이 : StringBuilder를 사용해서 my_string의 처음부터 마지막 인덱스까지, num1과 num2만 넣는 순서를 바꿔주고 재조립했다.
class Solution {
public String solution(String my_string, int num1, int num2) {
StringBuilder sb = new StringBuilder();
for(int i = 0; i < my_string.length(); i++) {
if(i == num1) {
sb.append(my_string.charAt(num2));
} else if (i == num2) {
sb.append(my_string.charAt(num1));
} else {
sb.append(my_string.charAt(i));
}
}
return sb.toString();
}
}
- 다른 사람 풀이1 : my_string을 toCharArray()로 바꿔주고, char[num1]과 char[num2]의 요소를 바꿔준 후, String.valueOf()를 사용해 String으로 바꿨다.
char[] chArray = my_string.toCharArray();
chArray[num1] = my_string.charAt(num2);
chArray[num2] = my_string.charAt(num1);
return String.valueOf(chArray);
- 다른 사람 풀이2 : my_string을 list로 바꾼 다음, Collections의 swap()을 사용하였다.
List<String> list = Arrays.stream(my_string.split("")).collect(Collectors.toList());
Collections.swap(list, num1, num2);
return String.join("", list);
3. 한 번만 등장한 문자
- 내 풀이 : HashMap을 사용해서 String s 내의 char 중복 카운트까지 저장한다. 이후 ArrayList에 map.value() == 1인 값들만 넣어서 String으로 변환했다.
import java.util.*;
class Solution {
public String solution(String s) {
ArrayList<String> list = new ArrayList<>();
HashMap<String, Integer> map = new HashMap<>();
for(String str : s.split("")) {
map.put(str, map.getOrDefault(str, 0)+1);
}
for(Map.Entry<String, Integer> entry : map.entrySet()) {
if (entry.getValue() == 1) {
list.add(entry.getKey());
}
}
Collections.sort(list);
return String.join("",list);
}
}
- 다른 사람 풀이 : 26개 소문자를 인덱스로 가지는 char 배열을 만들고, String s에 존재하는 소문자들을 비교해서 각 인덱스에 카운트를 실행한 다음 1번만 나온 알파벳을 얻는다.
- 코드가 훨씬 간략하고 아이디어 이해도 쉽다.
int[] alpha = new int[26];
for (char c : s.toCharArray()) {
alpha[c-'a']++;
}
StringBuilder sb = new StringBuilder();
for(int i = 0; i < alpha.length; i++) {
if (alpha[i] == 1) {
sb.append((char)(i+'a'));
}
}
return sb.toString();
4. 약수 구하기
import java.util.*;
class Solution {
public int[] solution(int n) {
List<Integer> list = new ArrayList<>();
for(int i = 1; i <= n; i++) {
if(n%i==0) {
list.add(i);
}
}
return list.streamintValue).toArray(;
}
}
- 다른 사람 풀이 : n보다 작은 자연수들 중 약수의 개수를 for문으로 먼저 구한 후, 약수의 개수를 크기로 갖는 배열을 만들어 약수를 넣는다.