2022. 12. 14. 12:48ㆍIT/Programmers
숨어있는 숫자의 덧셈 (Java)
import java.util.stream.Stream;
class Solution {
public int solution(String my_string) {
int answer = 0;
answer = Stream.of((my_string.replaceAll("[A-Z|a-z]",""))
.split(""))
.mapToInt(Integer::parseInt)
.sum();
return answer;
}
}
캬 3일만에 엄청 늘었다~ 드디어 stream 이용해서 문제를 풀어보네!
answer = my_String.chars()
.mapToObj(i -> (char) i)
.filter(Character::isDigit)
.map(String::valueOf)
.mapToInt(Integer::valueOf)
.sum();
다른 분 풀이
1) my_string.chars() : string을 char 단위로 분할
2) mapToObj(i -> (char) i) : 각각의 char을 obj char화 ?
3) filter(Character::isDigit) : isDigit() 이란 명시된 char값이 숫자면 true 아니면 false 반환하는 함수. 숫자만 뽑아내는게 이 부분인가보다!
4) map(String::valueOf) : String으로 변환
5) mapToInt(Integer::valueOf) : integer로 변환
6) sum() : 합치기
움..
내가 한 코드가 더 나아 보이는데 아닌가...모르겠다
소인수분해 (Java)
stream.reduce() : stream의 요소를 하나로 만드는 작업.
Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Optional<Integer> sum = numbers.reduce((x, y) -> x + y);
sum.ifPresent(s -> System.out.println("sum: " + s));
removeIf() : ArrayList의 원소 중에서 3으로 나누어떨어지는 원소만 삭제. 인덱스도 맞춰진다.
numbers.removeIf(n -> (n % 3 == 0));
하..
import java.util.*;
class Solution {
public int[] solution(int n) {
int[] answer = new int[(int)Math.sqrt(n)];
int div = 2;
int idx = 0;
while(n >=2 ) {
if(n%div == 0) {
answer[idx++] = div;
n /= div;
} else div++;
}
answer = Arrays.stream(answer).boxed().distinct().sorted().mapToInt(Integer::intValue).toArray();
return answer;
}
}
여기에서 0을 제거하고싶은데 어떻게 해야할지 모르겠다.. 일단 휴식.
다음 날...
Integer.parseInt(String s, int radix) : string 숫자를 radix 진수로 변환
오늘도 열심히 공부를 하며..
import java.util.Arrays;
class Solution {
public int[] solution(int n) {
int[] answer = new int[(int)Math.sqrt(n)];
int div = 2;
int idx = 0;
while(n >=2 ) {
if(n%div == 0) {
answer[idx++] = div;
n /= div;
} else div++;
}
answer = Arrays.stream(answer).boxed().distinct().filter(i -> i != 0).mapToInt(Integer::intValue).toArray();
return answer;
}
}
소인수 분해 제출.
그리고 유사한 두 코드를 가져와봤다.
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++;
}
}
return primeNumbers.stream().mapToInt(Integer::intValue).toArray();
}
}
LinkedHashSet<Integer> a = new LinkedHashSet<>() 을 사용하면 a.add()가 가능하다!!!
(배열에는 .add()사용이 불가능한 점이 힘들었기 때문)
List<Integer> a = new ArrayList<>(); 역시 a.add() 사용 가능. 나중에 int[] int배열로 전환하기가 용이하다.
LinkedHashSet<Integer> 든 List<Integer>든 int[] 로 변환할 때는
a.stream().mapToInt().toArray()를 사용.
mapToInt(Integer::intValue) 각 int값을 int로, mapToInt(i -> i) 각 int인 항목을 그대로 , 즉 서로 같은 내용인 듯.
import java.util.*;
class Solution {
public int[] solution(int n) {
List<Integer> factorList = new ArrayList<>();
for (int i = 2; i <= n; i++) {
if (n % i == 0) {
factorList.add(i);
while (n % i == 0) {
n /= i;
}
}
}
int[] answer = factorList.stream().mapToInt(i -> i).toArray();
return answer;
}
}
둘의 코드는 달라 보이지만 결국
i = 2m i <=n, n이 i로 나눠지는 동안 list에 i 추가, 계속 n /= i 반복, 그 후에 i++ 이라는 소인수 찾는 방법은 똑같다.
결국 처음에 int[] answer를 버리면 굳이 0제거가 필요 없었고..
무엇보다!!!!!!!!!!!!!!!!!!!!!!! add() 함수는 중복을 허용하지 않는다!!!!!!!!!!!!!!
중복제거를 따로 할 필요가 없던 것이다..ㅠㅠㅠ 나는 대체 코드가 똑같은데 왜 나는 중복 제거를 해야 하고 저들은 하지 않아도 되는지 한참을 분석했다..
문득 add가 설마...? 하고 알아보니 바로 나오는 '중복 허용 안함' 문구...
ㅎ. 사람은 이래서 공부를 해야 하는 것이다...
'IT > Programmers' 카테고리의 다른 글
[Programmers/코딩테스트 입문] 배열 원소의 길이 Java (0) | 2022.12.17 |
---|---|
[Programmers/ 코딩테스트 입문] 공던지기 ****다시보기 (2) | 2022.12.15 |
[Programmers/코딩테스트 연습] 모음제거 , 문자열 정렬Java (0) | 2022.12.13 |
[Programmers/코딩테스트 연습] 최댓값, 팩토리얼 Java (0) | 2022.12.11 |
[Programmers/코딩테스트 연습] 주사위의 개수, 합성수 찾기 Java (1) | 2022.12.10 |