TIL Java

내일배움캠프 20일차 TIL _ 5주 1일차

mad038 2024. 5. 13. 22:04

 

  • 오늘 있었던 일
    • 스프링 공부
    • 알고리즘 공부

SPRIONG

  • 스프링 정리

 

알고리즘 문제 풀기

     ●  과일 장수

더보기

● 과일 장수 //링크

import java.util.Arrays;
class Solution {
    public int solution(int k, int m, int[] score) {
        int box = score.length/m;
        int answer = 0;
        Arrays.sort(score);
        for (int i = 0; i < box; i++) {
            answer += score[score.length- (i + 1) * m] * m;
        }
        return answer;
    }
}
  • 첫 시도에 성공함
    • 문제 지문에
      • 사과는 상자 단위로만 판매하며, 남는 사과는 버립니다
    • 그렇다면 박스단위로 자르고 그 첫 값에서 m만 곱하면 됄러나? 
      • 성공
  • 밑은 다른 사람의 풀이
  • import java.util.Arrays;
    import java.util.Collections;
    import java.util.List;
    import java.util.stream.Collectors;
    import java.util.stream.IntStream;
    
    class Solution {
        public int solution(int k, int m, int[] score) {
            if (score.length < m) {
                return 0;
            }
            int numSaleApple = m * (score.length / m);
            List<Integer> collect = Arrays.stream(score)
                    .boxed()
                    .sorted(Collections.reverseOrder())
                    .limit(numSaleApple)
                    .collect(Collectors.toList());
            return IntStream.range(0, collect.size())
                    .filter(i -> i % m == m - 1)
                    .map(collect::get)
                    .reduce(Integer::sum)
                    .getAsInt() * m;
        }
    }
  • 스트림 문으로 풀어도 생각보다 길다.
  • import java.util.*;
    
    class Solution {
        public int solution(int k, int m, int[] score) {
            int answer = 0;
    
            Arrays.sort(score);
    
            for(int i = score.length; i >= m; i -= m){
                answer += score[i - m] * m;
            }
    
            return answer;
        }
    }
  • 나와는 반대로 최대값부터 구했다.

 

     ●  소수 만들기

더보기

● 소수 만들기//링크

import java.util.ArrayList;

import java.util.List;

class Solution {
    public int solution(int[] nums) {
        

        List<Integer> list = new ArrayList<>();

        for (int i = 0; i < nums.length - 2; i++) {
            for (int j = i+1; j < nums.length -1 ; j++) {
                for (int k = j+1; k < nums.length ; k++) {
                    int sum = nums[i] + nums[j] + nums[k];
                    list.add(sum);
                }
            }
        }

        int cont = 0;
        for(int i : list){
            int is = (int) Math.sqrt(i);
            for (int j = 2; j <= is ; j++) {
                if(i % j == 0){
                    cont++;
                    break;
                }
            }
        }
        int answer = list.size() - cont;
        return answer;
    }
}
  • 3가지의 수를 중복없이 더해야 한다 =  전에 풀었던 삼총사
    • 문제 지문에
      •  소수가 되는 경우의 개수를 구하려고 합니다
    • 소수를 구하려 하면 중간에 중복된다. 그렇다고 중간에 브레이크를 걸면 소수가 전부 선택돼지 않는다
      • 브레이크를 이용해 소수를 구한다 X
      • 반대로 소수가 아닌 값을 구해서 총 계수에서 뺀다. O
  • 성공함 밑은 다른 사람의 풀이
  • class Solution {
        public int solution(int[] nums) {
            int answer = 0;
            int sum =0;
            for(int i=0; i<nums.length-2; i++) {
                for(int j=i+1; j<nums.length-1; j++) {
                    for(int k=j+1; k<nums.length; k++) {
                           sum= nums[i]+nums[j]+nums[k];
                           for(int l=2; l<sum; l++) {
                            if(sum%l==0) {
                                   break;
                            }
                            if(l==sum-1) {
                                answer++;
                               }
                        }
                    }
                }
            }
    
            return answer;
        }
    }
  • 4중 반복문으로도 가능했구나

 

  


당일 회고

  • 스프링.. 쉬우면서 어려워...