1️⃣ 모음 제거
문제 설명
영어에선 a, e, i, o, u 다섯 가지 알파벳을 모음으로 분류합니다. 문자열 my_string이 매개변수로 주어질 때 모음을 제거한 문자열을 return하도록 solution 함수를 완성해주세요.
제한사항
- my_string은 소문자와 공백으로 이루어져 있습니다.
- 1 ≤ my_string의 길이 ≤ 1,000
입출력 예
my_string | result |
"bus" | "bs" |
"nice to meet you" | "nc t mt y" |
입출력 예 #1
- "bus"에서 모음 u를 제거한 "bs"를 return합니다.
입출력 예 #1
- "nice to meet you"에서 모음 i, o, e, u를 모두 제거한 "nc t mt y"를 return합니다.
💻 나의 풀이
class Solution {
public String solution(String my_string) {
return my_string.replaceAll("[a,e,i,o,u]", "");
}
}
replaceAll을 사용하여 해당 알파벳들을 " " 빈 문자열로 바꿔주어 간단하게 해결했습니다.
🔎 다른 사람의 풀이
class Solution {
public String solution(String my_string) {
return my_string.replaceAll("[aeiou]", " ");
}
}
정규표현식을 사용해 더 간단히 할 수도 있습니다.
- [ ]: 대괄호는 문자 클래스를 나타냅니다.
- aeiou: 문자 클래스 내부에 나열된 문자들 중 어떤 하나와 일치합니다.
💡 정규표현식 이란?
문자열의 패턴을 표현하는 데 사용되는 형식화된 문자열입니다. 주로 텍스트에서 특정한 문자 패턴을 찾거나 추출하거나 대체하는 작업에 활용됩니다. 예를 들어, 이메일 주소의 패턴을 찾거나 특정 단어의 발음을 검색하는 등의 작업에서 정규표현식이 사용될 수 있습니다.
2️⃣ 문자열 정렬하기 (1)
문제 설명
문자열 my_string이 매개변수로 주어질 때, my_string 안에 있는 숫자만 골라 오름차순 정렬한 리스트를 return 하도록 solution 함수를 작성해보세요.
제한사항
- 1 ≤ my_string의 길이 ≤ 100
- my_string에는 숫자가 한 개 이상 포함되어 있습니다.
- my_string은 영어 소문자 또는 0부터 9까지의 숫자로 이루어져 있습니다. - - -
입출력 예
my_string | result |
"hi12392" | [1, 2, 2, 3, 9] |
"p2o4i8gj2" | [2, 2, 4, 8] |
"abcde0" |
[0] |
- 입출력 예 #1
- "hi12392"에 있는 숫자 1, 2, 3, 9, 2를 오름차순 정렬한 [1, 2, 2, 3, 9]를 return 합니다.
- "p2o4i8gj2"에 있는 숫자 2, 4, 8, 2를 오름차순 정렬한 [2, 2, 4, 8]을 return 합니다.
- "abcde0"에 있는 숫자 0을 오름차순 정렬한 [0]을 return 합니다.
💻 나의 풀이
import java.util.Arrays;
class Solution {
public int[] solution(String my_string) {
String[] arr = my_string.replaceAll("[^0-9]", "").split("");
Arrays.sort(arr);
int[] answer = new int[arr.length];
for(int i=0; i<answer.length; i++){
answer[i] = Integer.parseInt(arr[i]);
}
return answer;
}
}
[^0-9] 는 0부터 9까지의 숫자가 아닌 모든 문자를 의미합니다.
replaceAll 메소드를 통해 숫자가 아닌 모든 문자를 제거합니다.
split 메소드를 통해 남은 숫자 문자열을 한 글자씩 나눠서 arr배열에 넣어줍니다.
결과적으로 각 숫자가 문자열 배열의 각 요소가 됩니다.
Arrays.sort를 이용해 arr배열을 오름차순으로 정렬한 뒤, parseInt 메소드를 통해 정수 배열로 변환해 반환해줍니다.
3️⃣ 숨어있는 숫자의 덧셈 (1)
문제 설명
문자열 my_string이 매개변수로 주어집니다. my_string안의 모든 자연수들의 합을 return하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ my_string의 길이 ≤ 1,000
- my_string은 소문자, 대문자 그리고 한자리 자연수로만 구성되어있습니다.
입출력 예
my_string | result |
"aAb1B2cC34oOp" | 10 |
"1a2b3c4d123" | 16 |
- 입출력 예 #1
- "aAb1B2cC34oOp"안의 한자리 자연수는 1, 2, 3, 4 입니다. 따라서 1 + 2 + 3 + 4 = 10 을 return합니다.
- "1a2b3c4d123Z"안의 한자리 자연수는 1, 2, 3, 4, 1, 2, 3 입니다. 따라서 1 + 2 + 3 + 4 + 1 + 2 + 3 = 16 을 return합니다.
💻 나의 풀이
class Solution {
public int solution(String my_string) {
String[] arr = my_string.replaceAll("[^0-9]", "").split(""); // 숫자만 추출하여 arr에 넣기
int answer = 0;
for(int i=0; i<arr.length; i++){
answer += Integer.parseInt(arr[i]);
}
return answer;
}
}
두번째 문제와 비슷한데 마찬가지로 replaceAll("[^0-9]", ""); 을 하여 숫자가 아닌 모든 문자를 제거해줬습니다.
그리고 split("") 으로 남은 숫자 문자열을 한 글자씩 나눕니다.
각 숫자를 정수로 변환하고 answer에 더 해줬습니다.
4️⃣ 소인수분해
문제 설명
소인수분해란 어떤 수를 소수들의 곱으로 표현하는 것입니다. 예를 들어 12를 소인수 분해하면 2 * 2 * 3 으로 나타낼 수 있습니다. 따라서 12의 소인수는 2와 3입니다. 자연수 n이 매개변수로 주어질 때 n의 소인수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.
제한사항
- 2 ≤ n ≤ 10,000
입출력 예
n | result |
12 | [2, 3] |
17 | [17] |
420 | [2, 3, 5, 7] |
입출력 예 #1
- 12를 소인수분해하면 2 * 2 * 3 입니다. 따라서 [2, 3]을 return합니다.
입출력 예 #2
- 17은 소수입니다. 따라서 [17]을 return 해야 합니다.
입출력 예 #3
- 420을 소인수분해하면 2 * 2 * 3 * 5 * 7 입니다. 따라서 [2, 3, 5, 7]을 return합니다.
💻 나의 풀이
import java.util.ArrayList;
class Solution {
public int[] solution(int n) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = 2; i <= n; i++) {
while (n % i == 0) {
list.add(i);
n /= i;
}
}
}
여기까지 풀다가 못 풀었습니다. 😥
일단 풀어본 데까지라도 설명해보자면
ArrayList<Integer> list = new ArrayList<>(); : 소인수를 저장할 리스트를 생성합니다.
for (int i = 2; i <= n; i++) { ... } : 2부터 n까지의 모든 수에 대해 반복합니다.
while (n % i == 0) { ... } : n을 i로 나누어 떨어지는 경우, i는 n의 소인수 입니다. 이것을 반복해서 소인수들을 구하고 list에 추가하고, n을 i로 나눕니다.
이제 중복된 소인수를 제거하고 정렬해야하는데 그 방법을 못찾았습니다.
🔎 다른 사람의 풀이
import java.util.ArrayList;
import java.util.TreeSet;
class Solution {
public int[] solution(int n) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = 2; i <= n; i++) {
while (n % i == 0) {
list.add(i);
n /= i;
}
}
TreeSet<Integer> set = new TreeSet<>(list);
int[] answer = new int[set.size()];
int index = 0;
for (int i: set) {
answer[index++] = i;
}
return answer;
}
}
list를 treeset으로 변환하여 중복된 소인수를 제거하고 정렬하고 있습니다.
그 후 treeset의 크기에 맞는 배열을 생성하고, 각 원소를 배열에 복사해줍니다.
import java.util.ArrayList;
import java.util.TreeSet;
class Solution {
public int[] solution(int n) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = 2; i <= n; i++) {
while (n % i == 0) {
list.add(i);
n /= i;
}
}
return list.stream().distinct().sorted().mapToInt(Integer::intValue).toArray();
}
}
스트림을 사용하면 더 간단하게 해결됩니다.
import java.util.LinkedHashSet;
class Solution {
public int[] solution(int n) {
LinkedHashSet<Integer> primeNumbers = new LinkedHashSet<>();
int i = 2;
while (n != 0 && i <= n) {
if (n % i == 0) {
primeNumbers.add(i);
n /= i;
} else {
i++;
}
}
// System.out.println(primeNumbers);
return primeNumbers.stream().mapToInt(Integer::intValue).toArray();
}
}
- LinkedHashSet<Integer> primeNumbers = new LinkedHashSet<>();: 소인수를 저장할 LinkedHashSet을 생성합니다. LinkedHashSet은 원소의 순서를 보장하면서 중복을 허용하지 않습니다.
- while (n != 0 && i <= n) { ... }: n이 0이 아니고 i가 n 이하인 동안 반복합니다.
- if (n % i == 0) { ... }: n을 i로 나눌 수 있는 경우, i는 n의 소인수입니다. 이를 LinkedHashSet에 추가하고, n을 i로 나눕니다.
- else { i++; }: 나눌 수 없는 경우, i를 증가시킵니다.
- return primeNumbers.stream().mapToInt(Integer::intValue).toArray();: LinkedHashSet의 값을 스트림을 통해 정수 배열로 변환하여 반환합니다.
이 코드는 LinkedHashSet을 사용하여 중복된 소인수를 방지하고, 입력된 순서대로 소인수를 저장하여 반환합니다.
'프로그래머스 > 0단계' 카테고리의 다른 글
DAY14 조건문, 반복문, 시뮬레이션, 문자열 (0) | 2023.12.01 |
---|---|
DAY13 문자열, 배열, 사칙연산, 수학, 조건문 (1) | 2023.11.30 |
DAY11 수학, 반복문 (1) | 2023.11.27 |
DAY10 조건문, 배열, 수학, 시뮬레이션 (0) | 2023.11.26 |
DAY9 수학, 문자열, 해시, 완전탐색, 조건문 (1) | 2023.11.25 |