[Programmers/코딩테스트 연습] 숨어있는 숫자의 덧셈

2022. 12. 14. 12:48IT/Programmers

728x90
반응형

숨어있는 숫자의 덧셈 (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가 설마...? 하고 알아보니 바로 나오는 '중복 허용 안함' 문구...

ㅎ. 사람은 이래서 공부를 해야 하는 것이다...

728x90
반응형