분류 전체보기 364

[Java] 백준 1965번 : 상자넣기

1. 문제 https://www.acmicpc.net/problem/1965 1965번: 상자넣기 정육면체 모양의 상자가 일렬로 늘어서 있다. 상자마다 크기가 주어져 있는데, 앞에 있는 상자의 크기가 뒤에 있는 상자의 크기보다 작으면, 앞에 있는 상자를 뒤에 있는 상자 안에 넣을 수가 www.acmicpc.net 2. 풀이 과정 처음에는 간단하게 (해당 데이터에서 최대 길이) = (해당 데이터보다 작고 앞에 있는 것 중 가장 큰 값) + 1을 해서 이중for문으로 구현했다. import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { public stat..

[Java] 백준 6087번 : 레이저 통신

1. 문제 https://www.acmicpc.net/problem/6087 6087번: 레이저 통신 크기가 1×1인 정사각형으로 나누어진 W×H 크기의 지도가 있다. 지도의 각 칸은 빈 칸이거나 벽이며, 두 칸은 'C'로 표시되어 있는 칸이다. 'C'로 표시되어 있는 두 칸을 레이저로 통신하기 위해서 www.acmicpc.net 2. 풀이 과정 처음에는 오는 방향에 따라 들어온 방향과 같으면 거울 수를 추가하지 않고, 들어온 방향과 다르면 거울 수를 추가해서 처리했다. PriorityQueue를 사용해서 사용한 거울 수가 작은 경로부터 처리해서 도착지가 나오면 종료했다. 코드는 아래에 [더보기]를 클릭하면 볼 수 있다. 더보기 import java.io.BufferedReader; import java..

[Java] 백준 1406번 : 에디터*

1. 문제 https://www.acmicpc.net/problem/1406 1406번: 에디터 첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수 www.acmicpc.net 2. 풀이 과정 [방법1] LinkedList + Iterator 처음에는 LinkedList를 사용해서 풀었다. LinkedList를 선택한 이유는 리스트 중간에 값을 삽입하고 삭제하는 과정이 빠르기 때문이다. 하지만 시간초과가 났다. 기존 코드에서는 커서가 있는 값을 index를 써서 해당 위치에 있는 값을 찾았기 때문에, LinkedList는 맨 처음 요소부터 index번째에 있는 ..

[Java] 백준 13549번 : 숨바꼭질 3

1. 문제 https://www.acmicpc.net/problem/13549 13549번: 숨바꼭질 3 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 www.acmicpc.net 2. 풀이 과정 [방법1] PriorityQueue를 이용한 BFS 도착 지점이 출발 지점보다 작은 경우, 빼기만 해서 가는 것이 가장 빠르므로 N-K를 출력한다. 아닌 경우는 PriorityQueue를 써서, 현재 최소 경로인 값에 +1, -1, *2 를 해본다. 더보기 import java.io.BufferedReader; import java.io..

[Spring] Spring Security Filter와 JWT 동작 과정

JWT란? Json Web Token의 약자로, 토큰을 통해 접근 권한을 확인 할 수 있기 때문에 디지털 서명이라고 볼 수 있다. 이전에는 서버의 session에 로그인한 회원을 저장하고, client에서 session id를 쿠키로 가지고 있어야 했다. 이 방식은 서버 프로그램이 여러 개일 때, 일관성을 유지하기 힘들다는 문제점이 있다. 따라서 따로 어디 저장할 필요 없이 로그인했다는 것을 확인할 수 있는 JWT가 탄생했다. JWT의 구조 1. Header : Signature를 암호화한 알고리즘 정보 & 토큰 타입 정보 2. Payload : Claim 1) 등록된 Claim(필수X) : iss(발행자), exp(만료 시간), sub(제목), aud(청중) 등이 있다. 2) 개인 Claim 정보를 공..

Programming/Spring 2023.02.20

[Java] 백준 10836번 : 여왕벌

1. 문제 https://www.acmicpc.net/problem/10836 10836번: 여왕벌 입력의 첫 줄에는 격자칸의 가로와 세로 크기 M(2 ≤ M ≤ 700)과 날짜 수 N(1 ≤ N ≤ 1,000,000)이 자연수로 주어진다. 첫날 아침의 애벌레 크기는 모두 1이므로 입력에 주어지지 않는다. 다음 N개의 www.acmicpc.net 2. 풀이과정 자라는 정도가 아래에서 위로 & 왼쪽에서 오른쪽으로 갈수록 증가한다. 따라서 가장 왼쪽 열과 가장 위쪽 행을 제외한 다른 칸들은 윗칸과 동일한 값을 가질 수 밖에 없다. 날짜수만큼 반복문을 돌면서, +1이 시작하는 위치와 +2가 시작하는 위치를 계산해서 해당 위치에 +1을 해준다. 반복문이 끝나면 증가량을 기록한 배열의 0번째 부터 끝까지 돌면서 ..

[Java] 백준 16953번 : A -> B

1. 문제 https://www.acmicpc.net/problem/16953 16953번: A → B 첫째 줄에 A, B (1 ≤ A B로 BFS를 사용해서 풀었었고, 나중에 다른 코드를 참고한 후에 B -> A로 갈 수 있는지 확인해가는 방식으로 풀게 됐다. 먼저 마지막이 1로 끝나는 수는 홀수 중에 하나이므로 연산을 홀수일 때, 짝수일 때로 나눠볼 수 있다. 짝수면 /2를 하고, 홀수 중에 1로 끝나면 /10을 한다. 둘 다 해당하지 않는 수는 만들 수 없는 수로 끝내면 된다. import java.io.BufferedReader; import java.io.InputStreamReader; import j..

[Java] 백준 14722번 : 우유 도시

1. 문제 https://www.acmicpc.net/problem/14722 14722번: 우유 도시 영학이는 딸기우유, 초코우유, 바나나우유를 좋아한다. 입맛이 매우 까다로운 영학이는 자신만의 우유를 마시는 규칙이 있다. 맨 처음에는 딸기우유를 한 팩 마신다. 딸기우유를 한 팩 마신 후 www.acmicpc.net 2. 풀이 과정 배열의 크기가 1000x1000이므로, DFS와 같은 완탐으로는 시간 초과가 날 것 같아서 DP로 시도했다. 아직 DP문제는 푸는 데 시간이 좀 걸린다.. 딸기 우유, 초코 우유, 바나나 우유 3가지 경우를 나눠서 생각하기 위해서 DP를 3차원 배열로 구현했다. 중간에 안 먹고 건너 뛸 수도 있어서 마지막에 어떤 종류를 먹었는지를 고려해주기 위해서다. 전체 배열을 2차원 배..

[Java] 백준 2668번 : 숫자고르기

1. 문제 https://www.acmicpc.net/problem/2668 2668번: 숫자고르기 세로 두 줄, 가로로 N개의 칸으로 이루어진 표가 있다. 첫째 줄의 각 칸에는 정수 1, 2, …, N이 차례대로 들어 있고 둘째 줄의 각 칸에는 1이상 N이하인 정수가 들어 있다. 첫째 줄에서 숫자를 적절 www.acmicpc.net 2. 풀이 과정 흔히 union & find를 구현할 때, find에서 사이클 여부를 판단한다. 이 문제는 find의 로직과 유사하게 구현할 수 있다. 사이클이 되는 모든 값을 결과로 출력하면 되는 문젠데, 처음부터 그래프 유형인걸 파악못해서 시간이 걸렸다. 1. for문으로 첫 번째 줄의 값을 처음부터 끝까지 탐색한다. 2. 각 값마다 cycle이 되는지 확인하고, cyc..

[Java] 백준 2374번 : 같은 수로 만들기

1. 문제 https://www.acmicpc.net/problem/2374 2374번: 같은 수로 만들기 n(1 ≤ n ≤ 1,000)개의 자연수 A[1], A[2], A[3], …, A[n]이 있다. 이 자연수에 Add(i)라는 연산을 하면, A[i]가 1만큼 증가한다. 이때, A[i]만 증가하는 것이 아니고, A[i]의 좌우로 인접한 같은 수의 그룹이 한 www.acmicpc.net 2. 풀이과정 문제 유형에 stack이 써있는 걸 보고 풀었다. 안 보고 풀었으면 생각해내기 어려웠을 것 같았다. 입력을 처음부터 끝까지 받으면서, 구간마다 최소값을 찾아서 큰 값에서 뺀 값을 결과에 더해주었다. 마지막에 최대값에서 stack의 top에 있는 값을 빼주는 이유는 값이 감소하면서 끝날 경우 앞서 나온 최댓..