Floyd-Warshall (플로이드-워셜)
·
알고리즘
들어가며플로이드-워셜은 "모든 정점 쌍 사이의 최단 경로"를 구하는 대표적인 알고리즘이다. 이 포스팅에서는 백준 11403번 문제를 통해 플로이드-워셜의 본질을 파악하고, 최단 거리가 아닌 "경로 존재 여부" 변형을 다룬다. 단순히 "삼중 for문으로 푼다"는 개념을 넘어서, 왜 k를 가장 바깥 루프에 두는지, 인접 행렬과 그래프 탐색의 차이는 무엇인지, BFS/DFS 대신 플로이드-워셜을 선택하는 기준은 무엇인지 등 구현하며 고민했던 지점들을 공유한다.플로이드-워셜 이란?모든 정점 쌍의 경로다음과 같은 그래프가 있다고 하자.1 -> 22 -> 3Q1. 1에서 3으로 갈 수 있나?직접 확인: graph[1][3] = 0 (간선 없음)간접 확인: 1 -> 2 -> 3 (경로 존재)플로이드-워셜은 이처럼 "..
Two Pointer (투 포인터)
·
알고리즘
들어가며투포인터는 연속된 구간을 효율적으로 탐색하는 알고리즘이다. 이 포스팅에서 탕후루 문제를 통해 투포인터를 알아보고 깊이 살펴본다.단순히 "left 와 right 포인터를 움직인다."는 개념을 넘어서, 실제 구현 시 마주치는 선택 지점들을 다룬다. 왜 그리디가 아닌 투포인터인지, HashMap 과 배열 중 무엇을 선택할지, 포인터 이동 시점은 언제인지 등 구현하며 고민했던 지점들을 공유한다.투포인터란?연속된 구간 탐색의 효율적 접근다음과 같은 배열에서 합이 5인 연속 구간을 찾는다고 하자.[1, 2, 3, 4, 5]완전탐색으로 찾기:[1] = 1[1,2] = 3[1,2,3] = 6[2] = 2[2,3] = 5 (찾음)모든 구간을 확인 -> O(N^2)투포인터로 찾기:left=0, right=0 → [..
응답 지연 시간: 실제로 측정해보기
·
CS(Computer Science)
들어가며가상 면접 사례로 배우는 대규모 시스템 설계 기초 의 2장 "모든 프로그래머가 알아야 할 응답 지연 시간 표" 를 보고 막연히 "디스크가 메모리보다 느리다" 는 건 알았지만, 실제로 얼마나 차이 나는지 궁금해졌다.그래서 직접 자바로 측정해보았다.측정 환경JMH (Java Microbenchmark Harness) 1.37Java 17OS: MacOSCPU: Apple M1Disk: SSD측정 항목책에 나온 연산 중 자바 애플리케이션 레벨에서 측정 가능한 것들로만 골랐다.뮤텍스 락/언락메모리 1MB 순차 read디스크 1MB 순차 read1KB GZIP 압축네트워크 왕복 지연 (localhost)측정 불가능한 것들: L1/L2 캐시 접근, 분기 예측 오류, 주 메모리 참조등은 CPU 내부 하드웨어 ..