전체 글 239

스프링 오류페이지

스프링 부트는 기본적으로 오류페이지를 제공한다. BasicErrorController ==> 스프링이 기본적으로 제공하는 오류관련 컨트롤러로 기본적인 로직이 모두 개발되어 있다. //// Source code recreated from a .class file by IntelliJ IDEA// (powered by FernFlower decompiler)//package org.springframework.boot.autoconfigure.web.servlet.error;import jakarta.servlet.http.HttpServletRequest;import jakarta.servlet.http.HttpServletResponse;import java.util.Collections;import j..

프로그래머스 - 전화번호 목록(Java)

문제 이해는 쉬웠으나 시간복잡도를 고려하면서 구현을 하려니 어려웠다. 처음에는 배열의 숫자들을 정수형으로 변형하고, 순회하며 자릿수를 체크하고 그 뒤의 숫자들의 처음부터 차릿수 까지의 숫자가 일치하면 answer를 false로 바꾸면 되겠다 싶어 구현했지만 고려하지 못한 케이스도 있고 시간복잡도 때문에 오답이 생기는 케이스가 생겼다. 고려하지 못한 부분각 숫자의 최대 자리수가 20이므로 이경우 정수형으로 변환 불가시간 복잡도 O(N^2)import java.util.*;class Solution { public boolean solution(String[] phone_book) { boolean answer = true; int[] nums = new int[..

알고리즘/해시 2025.01.06

스프링 인터셉터 - 인증 체크

로그인 처리를 쉽게 구현 할 수 있는 스프링 인터셉터에 대하여 공부 했다. 스프링 인터셉터는 스프링MVC가 제공하는 기술로 서블릿 필터를 이용하여 로그인을 구현 할때보다 쉽게 개발 가능하다.  HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러  스프링 인터셉터를 구현하기 위해서는 HandlerInterceptor를 구현 해주면 되는데, 총 3개의 메서드가 존재한다.preHandle  : 컨트롤러 호출 전에 호출된다.postHandle  : 컨트롤러 호출 후에 호출된다.afterCompletion : 뷰가 렌더링 된 이후에 호출된다.  로그인 처리 구현 package hello.login.web.interceptor;import hello.login.web.Session..

프로그래머스 - 완주하지 못한 선수(Java)

해시맵 클래스가 제공하는 함수를 적절히 사용해야 해시를 활용하여 풀 수 있었던 문제였다 정렬을 활용하여 검색import java.util.*;class Solution { public String solution(String[] participant, String[] completion) { String answer = ""; Arrays.sort(participant); Arrays.sort(completion); for(int i=0; iparticipant 배열과 completion 배열에 있는 이름을 오름 차순으로 정렬한다.두 배열을 순회 하면서 participant의 똑같은 위치에 있는 completion배열의 이름과 같지 않..

알고리즘/해시 2025.01.05

서블릿 필터 - 인증 체크

구현 해야하는 기능로그인을 하지 않은 유저는 허용되지 않은 페이지로 접근 불가(로그인 페이지로 이동)허용되는 페이지들만 따로 설정로그인 하지 않은 사용자가 앞으로 개발될 페이지에 대해서 접근 못하도록 하기 package hello.login.web.filter;import hello.login.web.SessionConst;import lombok.extern.slf4j.Slf4j;import org.springframework.util.PatternMatchUtils;import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servle..

프로그래머스 - 포켓몬(Java)

이 문제를 풀때 가장 핵심이 되었던 알고리즘은 해시맵에서 키가 중복이 되면 안된다는 것이었다. 만약 키를 중복해서 해시맵에 삽입하면 키가 중복되어 추가되는 것이 아닌 value값만 갱신된다. 문제 이해 우선 포켓몬의 종류 갯수를 알아야한다. 이를 알기 위해서는 중복된 값을 제거하여 각 포켓몬의 수를 알아내면 되는데 나는 이 과정을 해시를 이용하여 해결하였다.  문제 해결  for(int i=0; i  이러면 중복이 제거된 상태의 배열을 해시 맵에서 얻을 수 있다.  여기서 해시맵의 크기는 중복이 제거된 포켓몬의 수를 뜻한다.  if(map.size()==(nums.length)/2){ answer=map.size(); } else if(map.size() 최대..

알고리즘/해시 2025.01.04

프로그래머스 - 프로세스(Java)

처음에는 LinkedList를 이용하여 해결하려고 했는데 쉽지 않았다.다른 사람들의 풀이를 확인해보니 우선순위 큐를 이용하여 쉽게 해결할 수 있다는 것을 알게 되었다. 우선순위 큐//낮은 숫자가 우선 순위인 int 형 우선순위 큐 선언PriorityQueue priorityQueueLowest = new PriorityQueue();//높은 숫자가 우선 순위인 int 형 우선순위 큐 선언PriorityQueue priorityQueueHighest = new PriorityQueue(Collections.reverseOrder()); 이 문제 에서는 우선순위가 높은 프로세스가 먼저 처리 되어야 하므로 높은 숫자가 우선 순위인 우선순위 큐를 사용해야 한다.PriorityQueue pq = new Prior..

프로그래머스 - 올바른 괄호(Java)

스택 관련된 알고리즘 문제를 풀어봤다면 아주 쉽게 풀 수 있는 문제이다. 구현 과정은 다음과 같다.문자열 순회여는괄호 "(" 가 나오면 스택에 push닫는괄호 ")"가 나오면 스택에서 pop()연산 수행 **(닫는 괄호가 나왔을때 스택이 비어있다는 말은 그 뒤로도 올바른 괄호를 만족하지 않으므로 바로 false 리턴)문자열 순회가 끝났을때 스택이 비어있으면 참, 스택이 비어있지 않으면 거짓 리턴import java.util.*;class Solution { boolean solution(String s) { boolean answer = true; Stack stack = new Stack(); int size = s.length(); ..

로그인 처리 - 서블릿 HTTP 세션,@SessionAttribute,세션 타임아웃 설정

HttpSession을 이용하여 로그인, 로그아웃 처리를 구현 해보았다. HttpSession을 사용하면 기존에 구현했던 로그인 로그아웃 처리를 더욱 쉽게 구현 가능하다. 서블릿을 통해 HttpSession을 생성하면  쿠키가 생성된다. 이때 쿠키의 이름은 JSESSIONID이고, 값은 추정 불가능한 랜덤값이 부여된다.  코드 public interface SessionConst { String LOGIN_MEMBER = "loginMember";}HttpSession에 데이터를 보관하고 조회할때 같은 이름이 중복되어 사용되므로 인터페이스를 활용하여 상수 정의  @PostMapping("/login")public String loginV3(@Valid @ModelAttribute LoginForm..

프로그래머스 - 기능개발(Java)

배열과 큐를 이용해서 해결 하였다. 변수 설명head ==> 탐색을 시작할 위치(처음에는 head 변수 없이 이미 배포가 된 작업에 대해서도 체크를 해줘서 시간 초과가 발생하였다.)tail ==> progresses 배열의 크기큐 ans ==> 배포된 갯수를 차례대로 삽입, poll() 함수를 이용하여 answer 배열에 복사import java.util.*;class Solution { public int[] solution(int[] progresses, int[] speeds) { int[] answer = {}; Queue ans = new LinkedList(); int head=0; int tail=progresses.length; ..