2023.01.17.TUE

ronglong·2023년 1월 17일
0
  1. 프로그래머스 0단계
  • 숨어있는 숫자의 덧셈 (2)
    - split("정규식") 가능
class Solution {
    public int solution(String my_string) {
        String[] arr = my_string.split("[a-zA-Z]");
        int sum = 0;

        for(String i : arr){
            if(!i.equals("")) sum += Integer.parseInt(i);
        }

        return sum;
    }
}
  • 공 던지기
class Solution {
    public int solution(int[] numbers, int k) {
        int index = 2*k-1;
        while(true){
            if(index<=numbers.length) return numbers[index-1];
            else index -= numbers.length;
        }
    }
}
  • 문자열 계산하기
    - opers에 있는 공백 요소 때문에, out of index 에러가 떠서, 다시 join 후 계산했다.
class Solution {
    public int solution(String my_string) {
        my_string = my_string.replaceAll(" ", "");
        String[] nums = my_string.split("[+|-]");
        String[] opers = my_string.split("[0-9]");
        String str = String.join("", opers);

        int sum = Integer.parseInt(nums[0]);

        for(int i=0; i<str.length(); i++){
            if(str.charAt(i)=='+') sum += Integer.parseInt(nums[i+1]);
            else if(str.charAt(i)=='-') sum -= Integer.parseInt(nums[i+1]);
        }

        return sum;
    }
}
  • 구슬을 나누는 경우의 수
    • 맨처음에는 factorial을 순수하게 n부터 1까지 곱하여 계산했는데, 계속 2문제를 통과 못 했다.
      -> 찾아보니 사유는 factorial의 리턴값 크기가 long, double의 범위를 초과.
    • 따라서, 함수의 파라미터를 2개로 늘리고, 실제로 조합 계산식에서 무조건 약분되는 공통 부분을 뺐다.
      n!/(n-m)!*m! 이니까, 분모에서 m!을 빼고, 분자에서도 약분되는 부분을 뺀 것이다.
      즉, n*~*(m+1)/(n-m)!
      -> 실행 소요 시간도 짧아지고, 통과!
import java.lang.Math;

class Solution {
    public int solution(int balls, int share) {
        if(balls==share) return 1;
        if(share==1) return balls;
        return (int) Math.floor(factorial(balls,share)/factorial(balls-share,1));
    }

    static double factorial(int num1, int num2){
        double result =1;
        while(num1>num2){
            result *= num1;
            num1--;
        }
        return result;
    }
}
  1. Spring Security 인가(권한 부여, Authorization)
  • 어플리케이션 리소스 접근 권한 부여
  • 인가 처리 흐름
    -> AuthorizationFilter (Authencation 획득 from SecurityContextHolder, url 기반 권한 제한)
    -> AuthorizationManager에 Authencation, HTTPServletRequest 전달
    -> (AuthorizationManager) RequestMatcherDelegatingAuthorizationManager
    -> RequestMatcher 평가식 기반으로, 매치되는 AuthorizationManager에 권한 부여 처리 위임. RequestMatcher는 SecurityConfiguration의 메서드 체인 기반으로 생성됨
    -> AuthorizationManager 구현 클래스에서 권한 체크. check() 메서드는 구현 클래스마다 로직이 다름
    -> 권한 체크 후 부적절한 권한이면, AccessDeniedException 발생
    -> ExceptionTranslationFilter 에서 예외 처리
  1. 기타

<느낀 점>
오늘은 학습 분량이 조금 짧아서 일찍 봤다.
남은 시간에 공부하기 싫어서 알고리즘 문제 풀었다. 오늘은 그래서 4문제 풀었음.

오늘까지 스프링 시큐리티 기본에 대해 배웠고, 내일부터 JWT, Oauth 등을 배울 예정이다. 스프링 시큐리티 컴포넌트들을 커스텀해서 사용할 일이 현업에서 많으려나? 복잡했어서 그럴 일 별로 없으면 좋겠는데..
아직 안 배웠지만 현업에서는 JWT나 Oauth를 더 자주 사용하지 않을까 짐작해본다.

스프링 시큐리티 기본 개요 파트는 연휴 때 한 번 더 따라서 작성해봐야겠다.

0개의 댓글