본문 바로가기
  • 개발하는 곰돌이

분류 전체보기202

[Kotlin] 백준 20551 : Sort 마스터 배지훈의 후계자 문제 링크 20551번: Sort 마스터 배지훈의 후계자 지훈이는 Sort 마스터다. 오랫동안 Sort 마스터 자리를 지켜온 지훈이는 이제 마스터 자리를 후계자에게 물려주려고 한다. 수많은 제자들 중에 후계자를 고르기 위해서 지훈이는 제자들에게 문제 www.acmicpc.net 문제 해설 사용 알고리즘 : 이진탐색 문제 자체는 단순히 배열을 정렬한 후 M번에 걸쳐서 해당 요소의 첫 위치를 찾아내면 되는 문제이다. N과 M이 작다면 그냥 \(O(N\times M)\)인 indexOf()로 해결할 수 있지만 N과 M이 각각 최대 20만이기 때문에 이 방법은 시간초과가 발생한다. 코틀린에서는 이진탐색을 수행하는 binarySearch() 메소드가 존재하지만 이 메소드는 찾고자 하는 값을 발견하면 가장 첫 위치.. 2023. 8. 23.
[Java] UnmodifiableList는 진짜 불변 리스트가 아니다 목차 들어가기 전에 불변성이 강조되는 객체지향 프로그래밍의 특성상 자바에서도 UnmodifiableList라는 클래스가 존재한다(물론 List 뿐만 아니라 Map과 Set도 존재한다). UnmodifiableList라는 이름에 걸맞게 add(), set(), remove() 등 리스트의 내부가 변경되는 메소드를 사용하면 바로 예외가 터져버린다. 그런데 이 UnmodifiableList는 불변성을 보장하는 진짜 불변 리스트가 아니다. 이에 대해 알아보자. 이하의 모든 내용은 Map과 Set에도 동일하게 적용된다. UnmodifiableList 객체 선언 UnmodifiableList 객체는 다음과 같이 Collection.unmodifiableList()를 사용하여 선언할 수 있다. List unmodif.. 2023. 8. 15.
[Kotlin] 백준 1644 : 소수의 연속합 문제 링크 1644번: 소수의 연속합 첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 4,000,000) www.acmicpc.net 문제 해설 사용 알고리즘 : 에라토스테네스의 체, 누적합과 부분합, 투 포인터 N이 최대 4,000,000이기 때문에 단순 이중 반복문으로 소수 판정을 하면 시간초과가 발생한다. 따라서 에라토스테네스의 체를 사용하여 소수를 판정해야 한다.(코드의 26~35번째 줄) N 이하의 모든 소수를 판정했다면 이제 N이 소수들의 합으로 나타낼 수 있는지 확인해야 한다. 그런데 문제에서 '연속된 소수의 합'으로 나타낼 수 있는 경우의 수를 구하라는 언급이 있기 때문에 누적합과 투 포인터를 이용한 부분합을 사용하여 이를 효율적으로 구할 수 있다. 소수를 판별한 후 소수의 리스트를 반환.. 2023. 8. 11.
[Kotlin] 백준 12789 : 도키도키 간식드리미 문제 링크 12789번: 도키도키 간식드리미 인하대학교 학생회에서는 중간, 기말고사 때마다 시험 공부에 지친 학우들을 위해 간식을 나눠주는 간식 드리미 행사를 실시한다. 승환이는 시험 기간이 될 때마다 간식을 받을 생각에 두근두 www.acmicpc.net 문제 해설 스택을 사용하여 문제를 해결할 수 있다. 간식을 받기 위해서는 1번부터 순서대로 간식 받는곳으로 이동해야 한다. 그런데 줄이 뒤죽박죽 섞여있어서 왼쪽에 있는 1열의 공간을 이용하여 줄을 순서대로 간식을 받을 수 있게 해야한다. 이 1열의 공간을 일종의 스택으로 취급하여 문제를 해결하면 된다. 입력받은 학생 번호 순서대로 아래와 같이 간식 받기를 시도한다. 만약 현재 간식을 받아야 할 번호와 줄 맨 앞의 학생 번호가 일치하지 않는다면 대기 공.. 2023. 8. 9.
[Spring Security] 스프링 시큐리티를 적용하고 예외가 발생했을 때 403 Forbidden이 발생하는 원인과 처리 방안 목차 들어가기 전에 스프링부트 프로젝트에 스프링 시큐리티를 처음 적용해보면 여러 난관에 부딪히게 된다. 그 중 하나가 컨트롤러나 서비스 계층에서 발생한 예외의 종류에 상관없이 403 Forbidden 응답이 반환되는 것이다. 기본적으로 스프링에서는 따로 예외 처리를 하지 않았다면 예외 발생 시 500 에러가 발생한다. 그런데 스프링 시큐리티를 적용하면 메소드에서 예외가 발생했을 때 403 에러가 발생한다. 심지어 존재하지 않는 URL로 접속하여 404 Not Found가 발생해야 하는 상황에서도 403 Forbidden이 발생한다. 그 이유와 해결 방법에 대해서 정리하려고 한다. 다만 아직 스프링 시큐리티의 동작 과정을 완전히 이해하진 못했기 때문에 틀린 내용이 있을 수도 있다. 403 에러가 발생하는 .. 2023. 8. 5.
갤럭시 워치6 클래식 47mm 간단 후기! 기존에 갤럭시 워치4 44mm를 사용하다가 어제 워치6가 출시된걸 보고 고민하다가 결국 질렀습니다! 워치4 클래식은 괜찮긴 했는데 물리 베젤링이 너무 두꺼운 느낌이라서 일반으로 샀었는데 이번에 워치6는 물리 베젤링이 얇아진게 상당히 괜찮아 보여서 충동적으로(?) 질러버렸네요 ㅋㅋㅋㅋ 색상은 실버로 골랐습니다. 블랙은 뭔가 우중충해보여서 맘에 안들더라구요. 클래식이 47mm라서 조금 크진 않을까 걱정했는데 44mm랑 큰 차이는 없어 보입니다. 이번에 워치6부터 스트랩이 원터치 버튼방식으로 바뀌었다고 하던데 워치4 이상이랑 호환이 된다고 합니다. 위에 있는 사진도 기존에 워치4에서 사용하던 밀레니즈 루프 스트랩을 끼운건데 잘 맞더라구요. 그 외에는 아무래도 물리 베젤링이 들어가다보니 원래 쓰던거보다 좀 무거.. 2023. 7. 28.
[Kotlin] 백준 13305 : 주유소 문제 링크 13305번: 주유소 표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 도시의 개수를 나타내는 정수 N(2 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 인접한 두 도시를 연결하는 도로의 길이가 제일 왼쪽 도로부터 N-1 www.acmicpc.net 문제 해설 그리디 입문 문제. 문제의 내용 중에 기름통의 크기가 무제한이라는 언급이 있다. 기름을 무한정 축적할 수 있기 때문에 문제를 쉽게 해결할 수 있다. 마지막 도시까지 이동하는 최소 비용을 구하기 위해서는 다음 도시로 이동해가면서 현재 도시까지의 가장 저렴한 기름값과 남은 거리를 계산하여 더해주면 된다. 각 도시마다 주유소가 있다고 되어있지만 마지막 도시가 곧 도착지점이기 때문에 계산 과정에 포함되지 않아서 굳이 입력받을 필요는 없.. 2023. 7. 27.
[JWT] Access Token의 한계와 Refresh Token의 필요성 [수정사항] 2023-08-20 : 자바 코드의 TokenProvider 클래스에서 리프레시 토큰이 일치하는지 검사하는 메소드가 누락된 부분 수정 목차 들어가기 전에 이전에 스프링 시큐리티와 JWT를 이용한 사용자 인증을 구현한 프로젝트에 대한 글에서 리프레시 토큰을 언급한 적이 있다. 그래서 리프레시 토큰에 대해 다뤄보면서 기존에 JWT로 사용자를 검증하던 프로젝트에 리프레시 토큰을 적용해보려고 한다. 다만 리프레시 토큰의 구현 방법에 대해 깊게 이해하고 있는 것이 아니기 때문에 틀린 내용이 있을 수 있다. Access Token? Refresh Token? 액세스 토큰은 사용자에 대한 정보를 담고 있어서 서비스에 접근(Access)할 수 있는 토큰을 의미한다. 이전 예제 프로젝트에서 사용자 검증을 위.. 2023. 7. 19.