전체 글 129

[네트워크] 소켓 통신의 기본

글의 목적개발자가 일반적으로 사용하는 모든 TCP 네트워크 통신의 "API"인 소켓 통신의 기본 동작 원리를 이해함으로써, 추상화되어 잊기 쉬운 전송계층의 동작 원리를 "알아야 하는 부분까지" low Level 로 이해하기 위함이다.Top-Down 으로 접근하기에, 추후 전송 계층의 TCP 와 네트워크 계층의 IP까지 다룰 예정이다.서버(Server) & 클라이언트(Client) 모델우리가 컴퓨터에서 흔히 접하는 "클라이언트 & 서버" 라는 단어는 엄청 있어보이지만, 사실 실세계에서 매우 흔히 볼 수 있는 형태의 모델을 추상화해둔 패턴이다.클라이언트(Client)클라이언트는 서비스를 요청하는 쪽이다. 마치 식당에서 음식을 주문하는 손님처럼, 클라이언트는 어떤 정보를 얻거나 작업을 처리해달라고 요청하는 역..

Div.2 #930 C - Bitwise Operation Wizard

https://codeforces.com/contest/1937/problem/C현재 주어진 연산으로 가능한 것최댓값 찾기: a|a 최솟값 찾기: a|a 현재 주어진 순열은 [0, n-1] 범위를 갖는다.따라서, XOR로 만들 수 있는 최대의 정수는 상한이 정해져 있다.px ^ py = (n - 1의 msb) * 2 - 1그렇다면, 저 상한을 어떻게 만들어낼 것인가?최댓값(n-1)을 찾는다.최댓값과 or 연산을 수행하여 가장 큰 값을 만드는 인덱스들을 찾는다.해당 인덱스들의 집합에 들어가기 위해선 최댓값의 하위 비트가 0인 비트들을 1로 채울 수 있어야 한다. 예시) 11010 -> 1101, 101, 111, 10111XOR 도 결국 OR 되어야 하는데, 그냥 이러면 어떻게 답 안나오나 라는 느낌으로 ..

PS/Codeforces 2024.11.08

[객체지향] 일급 컬렉션

일급 (”First-class”) 이란?다음과 같은 조건을 만족하는 요소변수에 할당될 수 있음함수의 매개변수로 전달할 수 있음함수의 반환값으로 사용할 수 있음자료구조(배열, 객체 등) 에 저장할 수 있음일급 컬렉션컬렉션 자체를 하나의 클래스로 감싸놓은 것위 “일급 객체”의 “일급”과 다르다.컬렉션 자체에 하나의 “비즈니스적 이름”을 지어줘야 할 때 사용하는 일종의 패턴일급 컬렉션의 구조리스트를 클래스로 감싸놓음List에 대한 직접 접근을 막고, Users 클래스의 메소드로만 List에 접근을 허용하도록 접근을 제어List 내부의 원소에 적용해야 하는 연산에 대해, 지정된 메소드로만 내부 원소들에 연산을 적용하도록 한다일급 컬렉션을 만들어야 하는 이유컬렉션 자체에 비즈니스적 특징이 주어질 때 → 컬렉션에 ..

[Number Theory]디오판토스 일차방정식의 해의 존재성 증명

오늘도 코드포스 문제풀이를 하던 도중, 익숙한 방정식의 형태가 등장했는데, 정확히 어떻게 풀어야 하는지 기억이 잘 나지 않아, 이번 기회에 확실하게 정리하려고 한다.Div.2 # 955 D번을 풀던 중, 다음과 같은 방정식을 마주하게 되었다.$$ D = px + qy + rz + ... (x, y,z,... \in \mathbb{Z}) $$다음과 같은 형태의 방정식을 "디오판토스 일차방정식" 이라고 한다.실제로 디오판토스 방정식은 차수가 하나씩 늘어갈수록 난이도가 지수적으로 증가한다고 한다.지나치게 깊게 들어가지 않으면서, 적절하게 해당 해의 존재성을 증명하는 방법을 알아보자.위 방정식의 해가 존재하는 지를 구성적 증명으로 처리하려면, 완전 탐색 or 그래프 탐색 방식으로 접근해야 하는데, 이는 지나치게..

PS/이론 2024.10.14

[Test] LocalDateTime 을 사용하는 함수의 테스팅 방법

LocalDateTime 을 사용하는 함수는 어떻게 테스팅 해야하지?테스트 코드를 작성하는 도중, LocalDateTime 에 따라 기능이 달라지는 함수를 테스팅할 필요성을 느끼게 됐다.근데 LocalDateTime.now()를 사용하게 되면, 테스트가 현재 시간에 따라 테스트 결과가 달라지는 상태가 되고, 이는 테스트는 반복가능해야 한다라는 테스트 규칙을 위반하게 된다.가장 단순한 해결책은 LocalDateTime을 Mocking 하는 것이겠지만, 이는 권장되지 않는 방법이다.@Mock 어노테이션은 매 테스트마다 새로 초기화되기 때문에, 반복가능한 테스트 문제에 대한 걱정이 없지만,LocalDateTime 은 static 메소드라 메소드 영역에 존재하고, 다음 테스트에서 여전히 그 모킹이 유지되어 있을..

소프트웨어 공학적인 개발 방법

애플리케이션 개발 순서요구사항 분석뭐가 확장될 것 같은지, 아키텍쳐를 어떻게 설계할지 이 단계에서도 같이 생각 해보기주어져야 하는 메시지를 보고, 어떠어떠한 도메인(객체)가 있는지 생각해보기. → Domain-Driven Design안정적인 구조(확실한 도메인)가 확장성 높은 소프트웨어를 만든다.아키텍처 설계도메인 탐색도메인 별 정의 서술 (Documentation)도메인 별 유스케이스 다이어그램 생성유스케이스별 협력, 책임, 역할 다이어그램화“기능 별”로 필요한 객체 다이어그램 설계 - 해당 기능을 구현하는 데 사용되는 객체들 생성하기다이어그램이 잘 안그려진다면 → 빼먹은 액터는 없는지, 단위기능이 너무 큰건 아닌지 분리해보기필요한 책임에 따른 아키텍쳐 설계도메인의 역할, 책임(기능), 협력(메시지) ..

Div.2 #961 C - WA

문제 링크: https://codeforces.com/contest/1995/problem/C오버플로우를 막는 방법에 대한 고민핵심 아이디어a^x^2 a^x >= b^y 인 경우는 없다증명1 초과인 a, b, x, y에 대하여a^x a^x^2 > b^y 이면a^x^2 a^x = p, b^y = q 라고 하면p p * p p * p 따라서 핵심은, 몇번의 제곱을 수행해야 하느냐!오버플로우를 신경쓰지 않도록, 2^63 내에서 대소 비교를 수행하는 방법실제 문제를 풀진 못했으므로, 구현은 남기지 않음

PS/Codeforces 2024.09.29

[OS] Thread의 정의와 Thread Pool, 그리고 적절한 Thread의 갯수

글의 목적우리가 컴퓨터를 살때, CPU가 8코어 16스레드라고 하는 수치를 보고, 오... 16개의 스레드까지 병렬 프로그래밍이 가능하구나... 라는 생각을 하게 된다.근데 운영체제에서 마주치는 "스레드"라는 단어는 위 내용과는 사뭇 다른 느낌으로 정의된 단어라는 느낌이 강렬하게 들게 된다.또한, 스레드 풀에서의 스레드와도 비슷한 개념이면서 미묘하게 다른 점을 갖고 있고, 이게 혼동되기 쉽다고 생각한다.따라서, 이를 체계적으로 정리하고자, 해당 글을 작성한다.CPU 에 존재하는 스레드는 무엇인가?해당 스레드라는 단어는, 원래 정식 명칭이 아니다.과거에 이 "스레드"는, Simultaneous Multi-Threading 이라는 기법으로 불렸으나, 인텔(Intel) 의 상술로 "하이퍼스레딩" 이라는 상표명..

분석 마비

주의 - 소프트웨어 공학에서 이야기하는 “분석 마비(Analysis Paralysis)” 와 그 해결책으로 나온 애자일 개발 방법론과는 약간 다른 주관적인 관점에서 느낀 내용을 바탕으로 이야기함.현재까지 내가 생각한 소프트웨어 개발의 과정과, 그 모순일반적인 소프트웨어 개발 과정: 설계 → 검증 → 구현검증만 두번 하는 것 같다는 생각을 하게 됨설계를 검증하는 걸 이미 가운데 단계에 했으니구현은 생산적인 결과를 도출하지 않는 무의미한 과정이 되어버림자꾸 좀 더 완벽한 설계만을 찾게 되는 문제 발생.문제점과 그 핵심근데 오만한 생각임. 자료구조를 검증하지 않음.근데 사실 검증하는 타겟 자체가 다름자료구조의 설계 검증 → 구현을 통해서 가능구현력에 따라 자료구조 설계의 검증 결과가 달라짐알고리즘의 논리 검증..

스프링 시큐리티 stack overflow

느낀점진짜 단위테스트 통합테스트가 진짜 중요하구나버그 찾기 진짜 까다로워지네문제 분석java.lang.StackOverflowError: null at java.base/java.lang.Exception.(Exception.java:103) ~[na:na] at java.base/java.lang.ReflectiveOperationException.(ReflectiveOperationException.java:90) ~[na:na] at java.base/java.lang.reflect.InvocationTargetException.(InvocationTargetException.java:68) ~[na:na] --------무한루프 시작-------- at java.base..

스프링 시큐리티 인증 아키텍처

전체 구조AuthenticationFilter : AuthenticationManager = N : 1AuthenticationManager : AuthenticationProvider = 1 : NSecurityContextHolder - Spring Security에서 인증된 사용자의 세부 정보를 저장하는 곳입니다. 이는 현재 애플리케이션의 보안 컨텍스트에 대한 중앙 저장소 역할을 합니다.SecurityContext - SecurityContextHolder에서 얻을 수 있으며, 현재 인증된 사용자의 Authentication 객체를 포함합니다. 이는 현재 실행 중인 스레드와 연관된 보안 정보를 담고 있습니다.Authentication - 두 가지 주요 목적으로 사용됩니다:AuthenticationM..

스프링 시큐리티 아키텍처

Spring Security 아키텍처Spring Security는 서블릿 기반 애플리케이션에서 서블릿 필터를 사용합니다.HTTP 요청이 들어오면 컨테이너는 FilterChain을 생성합니다.FilterChain은 요청 URI 경로를 기반으로 처리할 Filter 인스턴스들과 Servlet을 포함합니다.여러 Filter가 요청을 가로채거나 수정할 수 있으며, 최종적으로 하나의 Servlet이 요청을 처리합니다.Filter의 순서가 매우 중요하며, 이는 보안 로직의 순서를 결정합니다.DelegatingFilterProxy서블릿 컨테이너의 생명주기와 Spring의 ApplicationContext를 연결하는 역할을 합니다.서블릿 컨테이너에 표준 방식으로 등록되지만, 실제 작업은 Spring Bean으로 등록된 ..

Div.2 #965 C

k제일 큰 수에 1이 있으면?그냥 그거 쭉 늘리면 됨제일 큰 수에 1이 없으면?1이 붙은 수 중 가장 큰 수를 늘리거나큰수와의 차이만큼 낭비그 후 효율 떡상(1)중간값을 늘리거나효율 갈수록 안좋아짐이거 이분탐색 되려나?그래프가 ~자 모양이 됨효율 이김/안이김 이분탐색?몰빵보다 좋음/안좋음?이건 몰빵한테 따이는 시점 이분탐색인데중간값을 늘리는 시도를 점차 증가시켜본다?왜 그게 그렇게 되지?왜 최대 원소가 효율을 뽑기 시작하거나k 개 중 x개를 투자하면그 이후 k - x 개는 무조건 큰 수에 넣는게 제일 고효율이다문턱값을 넘으면 그 이후는 거기에 몰빵하는게 무조건 이득중간값을 올리는데 전부 몰빵하거나문턱값 안넘을거면 그냥 중간값 올리는데 몰빵이 나음그럼 중간값을 어떻게 올리지?순서가 동적으로 바뀌는데정해진 ..

PS/Codeforces 2024.09.27

Div.2 #967 C

트리 구조로 되어있는 숨겨진 그래프n-1 개의 간선을 찾아야 함15n 개의 쿼리를 통해n≤1000트리 구조의 특성상, 임의의 두 노드 사이의 경로는 유일하다한번에 하나씩 컴포넌트를 합쳐나가면?유니온 파인드 이용사이에 모르는 컴포넌트가 나오면?그냥 그거 찾지 뭐...?중요한건 임의의 두 컴포넌트를 "연결" 하고자 하는 것거리가 절반씩 줄어드니, logN서로 다른 두 컴포넌트 찾는 법유니온 파인드import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;//Change Class Name to ..

PS/Codeforces 2024.09.27

Div.2 #968 D1

mex를 사용하여 입력받은 값을 최대로 만드는 문제mex는 두번 사용하면 최대로 커지므로, 이를 이용해 달성 가능한 가장 큰 값을 리스트를 순회하며 확인한다.만약 한번만 사용가능했다면 그래프 문제가 됐을 것 같다.맨날 전역에 동적 메모리 할당하고, 오랜만에 PS하느라 까먹었는데메모리 할당도 할당된 크기만큼 시간이 든다!시간복잡도 터지는것에 주의하자.import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.util.*;//Change Class Name to Proble..

PS/Codeforces 2024.09.27

Div.2 #953 C

k 번마다 전구가 on-off 됨시간 - 스타트시간/k 의 값이짝수이면 켜진 시점홀수이면 꺼진 시점무조건 모든 전구가 한번이라도 켜진 시점 이후 k시간 안에 전구가 켜져야됨이후는 반복되는 패턴(x - a_i) / k 의 패리티가 모두 짝수인 가장 작은 x최대와 최소 사이 공간이 존재하냐를 묻는 문제로 바뀜((x - a_i) / k) % 2 == 1x += k - (x - a_i) % k(x - a_i) / k % 2 == 0y = min(y, x + k - (x - a_i) % k)import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import..

PS/Codeforces 2024.09.27