전체 글 79

[코딩 테스트, 더 이상 미룰 수 없다] 최소 신장 트리: 크루스칼과 프림, 그리고 완전 그래프에서의 프림 구현

이번 26년 7월에 있었던 현대 오토에버 코테 문제에는 힙을 사용한 문제들이 출제되었습니다.그 중 하나가 최소 신장 트리를 이용한 문제였던거 같은데, 저는 이에 대한 대비가 되어있지 않아 풀지 못했습니다아.. 그래서 부족한 부분을 빠르게 학습해야 합니다!! 그래프의 최소 비용 문제를 공부하다 보면 다익스트라와 최소 신장 트리를 자주 혼동하게 됩니다. 두 유형 모두 간선에 비용이 있고 최소값을 구한다는 공통점이 있지만, 구하려는 대상이 다릅니다. 프로그래머스의 섬 연결하기를 통해 최소 신장 트리를 처음 정리했고, 크루스칼과 프림 알고리즘을 비교했습니다. 이후 SWEA 하나로를 풀면서 기존의 힙 프림이 항상 효율적인 방식은 아니라는 점도 확인했습니다.이번 글에서는 다음 순서로 내용을 정리합니다. 최소 신장 ..

[코딩 테스트, 더 이상 미룰 수 없다] 프로그래머스lv3: 자물쇠와 열쇠 - 회전함수, 확장배열, 배열 검사

이게 왜 레벨3? 이정도면 빡구현 아닌가요..(그래도 이 정도 자유자재로 풀면 맘편하게 코테에 들어갈 정도가 될 듯) 프로그래머스의 자물쇠와 열쇠 문제를 처음 읽었을 때는 어디서부터 구현해야 할지 감이 잡히지 않았다.열쇠를 회전해야 하고, 자물쇠 밖으로도 이동할 수 있으며, 홈과 돌기가 정확히 맞는지 확인해야 한다. 조건을 하나씩 보면 이해할 수 있지만, 이를 코드의 반복문과 좌표로 옮기는 과정이 어려웠다.이번 문제를 통해 2차원 배열 구현 문제를 풀 때 필요한 몇 가지 사고방식을 정리했다.1. 문제를 탐색 단위로 나누기처음에는 열쇠 모양과 자물쇠 모양을 비교해 맞는 위치를 찾아야 한다고 생각했다. 이렇게 접근하면 돌기의 위치를 따로 저장하거나 홈과 일대일로 비교하는 복잡한 로직을 떠올리게 된다.문제에서..

[코딩 테스트, 더 이상 미룰 수 없다] swea:탈주범 검거 -다양한 조건의 BFS 풀어보기

BFS 문제를 처음 풀 때는 대부분 이동 조건이 단순했다.상하좌우로 이동할 수 있다.벽이 아니면 이동할 수 있다.방문하지 않았다면 큐에 넣는다.하지만 SWEA의 탈주범 검거는 같은 BFS 문제이면서도 확인해야 하는 조건이 훨씬 많다.현재 위치에 터널이 있다고 해서 무조건 상하좌우로 이동할 수 있는 것도 아니고, 현재 터널이 이동 방향으로 열려 있다고 해서 반드시 다음 칸으로 갈 수 있는 것도 아니다.다음 터널 역시 현재 터널과 연결되는 방향으로 열려 있어야 한다.여기에 제한 시간까지 고려해야 한다.이번 문제의 주요한 점은, 문제에 주어진 여러 이동 조건을 어떤 순서로 정리할 것인가였다.1. 문제를 어떻게 이해해야 할까?문제의 목표는 맨홀 위치에서 출발한 탈주범이 제한 시간 L 안에 있을 수 있는 터널 칸..

[코딩 테스트, 더 이상 미룰 수 없다] 프로그래머스lv3: 경주로 건설 - 방향이 포함된 최소 비용 탐색(다익스트라)

코테보고 후기들을 보면 '이거 어떻게 푸는거야;' 했던 문제들은"다익스트라 우선순위 큐로 풀었습니다. 2.5솔" 해당 유형의 문제를 자유자재로 푼다면 어려운 난이도의 코테도 1솔은 할 수 있지 않을까...(현재 저의 목표입니다)문제로 돌아와봅시다. 경주로 건설 문제를 처음 봤을 때는 등굣길 문제처럼 DP 배열을 채우면 될 것 같았다.직선 도로는 100원, 코너가 생기면 500원이 추가되므로 현재 위치까지의 최소 비용을 저장하고 다음 칸으로 넘기면 된다고 생각했다.처음 스케치한 코드는 다음과 비슷했다. def solution(board): n = len(board) for direction in range(4): nx = x + dx[direction] ny = y +..

[코딩 테스트, 더 이상 미룰 수 없다] SWEA 미생물 격리와 여러 객체의 상태 관리 - 탐색과 여러 객체 상태 관리하기

이번 문제는 SWEA 2382 미생물 격리다.격자 안에 여러 미생물 군집이 존재하고, 각 군집은 한 시간마다 정해진 방향으로 이동한다. 가장자리에 도착하면 미생물 수가 절반으로 줄고 방향이 반대로 바뀐다. 여러 군집이 같은 칸에 도착하면 하나로 합쳐진다. 문제를 읽고 이동 방향부터 작성했다.dx = [0, 0, -1, 1]dy = [-1, 1, 0, 0]for i in range(M): for _ in range(K): x, y, count, direction = map(int, input().split()) nx = x + dx[direction] ny = y + dy[direction] if nx == 0 or nx == N - 1 or ny =..

[코딩 테스트, 더 이상 미룰 수 없다] 프로그래머스lv2: 혼자서 하는 틱택토 - 고난도 코테 대비하기

이번 코딩테스트 준비에서는 구현 난도가 높은 문제를 집중적으로 풀어보기로 했다. 첫 문제로는 엄청 어렵지 않은 프로그래머스의 혼자서 하는 틱택토다. 문제 자체는 3×3 크기의 작은 보드를 다루지만, 현재 상태가 실제 게임 진행 과정에서 나올 수 있는 상태인지 판단해야 한다.보드 크기가 작아서 구현은 짧지만, 종료 조건과 돌의 개수 관계를 정확히 정리하지 않으면 예외를 놓치기 쉽다. 문제에서 확인해야 할 조건틱택토는 O가 먼저 시작하고, 이후 X와 번갈아 돌을 놓는다.따라서 보드 위 돌의 개수는 항상 다음 두 경우 중 하나여야 한다.O 개수 == X 개수O 개수 == X 개수 + 1O가 한 번 먼저 시작하기 때문에 X가 O보다 많을 수 없고, O가 X보다 두 개 이상 많을 수도 없다.승리 조건까지 고려..

[코딩 테스트, 더 이상 미룰 수 없다] 프로그래머스lv3 - 정수 삼각형 : DP 사고하기

이번에는 프로그래머스 정수 삼각형 문제를 풀면서 DP를 어떻게 생각했는지 정리해보려고 한다. 코딩 테스트를 준비하며 DP 형태는 꼭 준비해야 하기에 꼼꼼히 이해하고 넘어가야 활용이 가능할 것이라 생각한다. DP는 Dynamic Programming의 줄임말로, 이미 계산한 값을 저장해두고 다시 활용하는 방식이다.핵심은 다음과 같다.현재 위치의 답을 이전에 구한 답으로 만들 수 있는가?즉, 모든 경우를 매번 새로 계산하지 않고, 이전 단계에서 구한 값을 이용해 현재 단계의 답을 채우는 방식이다. 이번에 푼 문제는 프로그래머스의 정수 삼각형이다. 위에서 아래로 내려가면서 숫자를 더할 때, 만들 수 있는 가장 큰 합을 구하는 문제다.https://school.programmers.co.kr/learn/cou..

프리패칭(Background Prefetching) - Next.js 서비스의 초기 로딩 속도 개선 기록

최근 관리자 화면의 로딩 속도를 개선했습니다. gif로 화면을 따고 싶지만, 내부 유출 문제로 그러지 못해서 아쉽습니다.... 해당 화면은 제품 제작에 필요한 기본 데이터를 관리하는 곳입니다. 자재, 원판 규격, 품목, 부품 구성 같은 데이터를 한 화면에서 다루고 있습니다. 처음에는 사용자가 화면에 들어올 때 모든 데이터를 한 번에 불러오고 있었습니다. 데이터가 많지 않을 때는 큰 문제가 없어 보였지만, 실제 운영 데이터가 쌓이면서 첫 화면 진입이 느려졌습니다. 저장이나 수정 후에도 전체 화면을 다시 불러오는 구조였기 때문에 체감 속도도 좋지 않았습니다.문제 상황개선 전 기준정보 화면의 응답 시간은 다음과 같았습니다.2.75s1.50s1.43s1.42s1.43s중앙값은 약 1.43초였습니다.이 화면은..

[트러블 슈팅] Wi-Fi에서 특정 사이트만 접속되지 않는 문제를 네트워크 계층별로 추적한 기록 (AdGuard 광고차단기 인터넷 접속 문제)

최근 맥북에서 이상한 네트워크 문제가 발생했습니다. 핫스팟으로 연결하면 인터넷이 정상적으로 되었지만, Wi-Fi에 연결하면 일부 사이트가 열리지 않았습니다. 처음에는 Wi-Fi 자체가 문제라고 생각했습니다. 하지만 확인해보니 Notion 같은 서비스는 Wi-Fi에서도 접속되었습니다. 반면 자소설닷컴, ChatGPT, GPT 응답과 관련된 서비스는 Wi-Fi에서 접속되지 않았고, 핫스팟에서는 정상적으로 접속되었습니다.문제를 해결하는 과정에서 단순히 “인터넷이 안 된다”가 아니라, 컴퓨터 네트워크 관점에서 어떤 계층에서 문제가 발생하는지 나누어 확인했습니다.1. 문제 범위 정의처음 증상은 다음과 같았습니다.핫스팟에서는 정상 접속Wi-Fi에서는 일부 사이트 접속 실패Notion은 Wi-Fi에서도 접속 가능자..

낙관적 업데이트(use optimistic) 적용 기록

개인적으로 진행하는 프로젝트 때문에 현장 상세 화면의 반응성을 개선했다. 기존에는 부품을 추가하거나 삭제할 때마다 서버 요청이 끝난 뒤 router.refresh()로 페이지 전체 데이터를 다시 불러왔다. 기능상 문제는 없었지만, 사용자가 버튼을 눌렀을 때 화면이 늦게 반응하는 느낌이 있었다. 특히 부품 삭제는 사용자가 기대하는 동작이 명확하다. 삭제 버튼을 누르면 해당 행이 바로 사라져야 한다. 하지만 기존 구조에서는 다음 순서를 거친다.삭제 버튼 클릭→ DELETE API 요청→ DB 삭제→ router.refresh()→ 현장 상세 데이터 전체 재조회→ 화면 갱신서버 왕복과 전체 데이터 재조회가 끝나야 화면이 바뀌기 때문에, 실제 작업보다 느리게 느껴졌다. 개선 방향이번 개선의 핵심은 단순..