[백준 / 11728 / Python] 배열 합치기 최적화: 시간복잡도 O(N log N)에서 O(N)으로 개선하기
·
Algorithm/백준
알고리즘 문제를 풀다 보면 "동작은 하지만 더 효율적으로 할 수 있지 않을까?" 라는 생각이 들 때가 있습니다. 오늘은 백준 11728번 '배열 합치기' 문제를 통해 단순한 접근법에서 최적화된 해결책으로 발전하는 과정을 살펴보겠습니다.문제 분석문제 설명백준 11728번: 배열 합치기시간 제한: 1.5초메모리 제한: 256MB정답 비율: 46.789%문제 내용: 이미 정렬되어 있는 두 배열 A와 B가 주어질 때, 두 배열을 합친 다음 정렬해서 출력하는 프로그램을 작성해야 합니다.입력 조건첫째 줄: 배열 A의 크기 N, 배열 B의 크기 M (1 ≤ N, M ≤ 1,000,000)둘째 줄: 배열 A의 내용 (정렬된 상태)셋째 줄: 배열 B의 내용 (정렬된 상태)배열 원소: 절댓값이 10⁹보다 작거나 같은 정수..
CSRF 공격과 방어 전략: 웹 보안의 핵심 이해하기
·
Backend Development
웹 개발을 하다 보면 반드시 마주치게 되는 보안 이슈 중 하나가 바로 CSRF(Cross-Site Request Forgery) 공격입니다. 특히 백엔드 개발자라면 이 공격 방식과 방어 전략을 정확히 이해하고 있어야 안전한 웹 애플리케이션을 만들 수 있습니다.CSRF 공격이란 무엇인가?사이트 간 요청 위조(Cross-Site Request Forgery, CSRF) 공격은 사용자가 자신의 의지와 무관하게 공격자가 의도한 행위를 특정 웹사이트에 요청하도록 하는 공격 방식입니다.쉽게 말해, 마치 은행에서 본인인척 하면서 다른 사람이 여러분의 계좌에서 돈을 인출하는 것과 같은 원리입니다. 사용자는 자신이 로그인한 상태를 악용당하게 되는 것이죠.CSRF 공격의 동작 원리1단계: 정상적인 로그인 과정사용자 → [..
JavaScript 프로토타입 상속: 객체 간 상속의 핵심 메커니즘 완전 정복
·
Frontend Development
자바스크립트를 공부하다 보면 프로토타입(Prototype)이라는 개념을 마주하게 됩니다. 클래스 기반 언어에 익숙한 개발자들에게는 다소 생소할 수 있지만, 프로토타입은 자바스크립트의 객체지향 프로그래밍을 이해하는 핵심 요소입니다. 오늘은 프로토타입 상속이 어떻게 동작하는지 자세히 알아보겠습니다.프로토타입이란 무엇인가?프로토타입은 자바스크립트에서 객체 간의 상속을 구현하는 메커니즘입니다. 마치 가족의 유전자처럼, 부모 객체의 특성을 자식 객체가 물려받을 수 있게 해주는 시스템이라고 생각하면 됩니다.자바스크립트의 모든 객체는 [[Prototype]]이라는 숨김 프로퍼티를 가지고 있습니다. 이 프로퍼티는 다른 객체를 참조하거나 null 값을 가질 수 있습니다.주요 특징모든 객체는 프로토타입을 가집니다프로토타입..
연결 리스트(Linked List) 완전 정복: 메모리 효율적인 동적 자료구조의 모든 것
·
자료구조
자료구조를 공부하다 보면 배열 다음으로 만나게 되는 것이 바로 연결 리스트(Linked List)입니다. 배열의 한계를 보완하면서도 동적으로 크기를 조절할 수 있는 연결 리스트는 많은 프로그래밍 상황에서 핵심적인 역할을 합니다. 오늘은 연결 리스트의 개념부터 실제 구현, 그리고 실무 활용까지 체계적으로 알아보겠습니다.연결 리스트란 무엇인가?연결 리스트는 리스트 내의 요소(노드)들을 포인터로 연결하여 관리하는 선형 자료구조입니다. 마치 기차처럼 각 칸(노드)이 다음 칸을 가리키는 연결고리로 이어져 있다고 생각하면 됩니다.연결 리스트의 핵심 구성 요소노드(Node): 데이터와 다음 요소에 대한 포인터를 가진 기본 단위HEAD: 첫 번째 노드를 가리키는 포인터TAIL: 마지막 노드를 가리키는 포인터// 노드의..
두 개의 스택으로 큐(Queue) 구현하기: 실전 면접에서 마주한 낯선 자료구조 문제
·
자료구조
최근 실전 면접 라이브 코딩에서 "두 개의 스택으로 큐를 구현하라"는 문제를 처음 접했습니다. 평소에는 백준, 프로그래머스 등에서 알고리즘 문제만 풀어왔기에, 이렇게 직접 자료구조를 구현하는 문제는 예상치 못해 당황스러웠습니다. 이 글에서는 그때의 경험을 바탕으로, 문제의 개념과 구현 방법, 그리고 느낀 점을 정리합니다.문제 소개: 알고리즘 문제만 풀다가 만난 직접 구현 과제자료구조 면접에서 "스택(Stack)과 큐(Queue)의 차이"는 종종 등장하지만, 실제로 스택 두 개로 큐를 직접 구현하라는 문제는 저에게도 처음이었습니다. 단순히 개념을 아는 것과, 직접 코드를 짜는 것은 완전히 다르다는 점을 실감했습니다.스택(Stack): LIFO(Last-In-First-Out, 후입선출)큐(Queue): F..
[백준 / 2578 / Python] 빙고
·
Algorithm/백준
문제 요약5×5 빙고판에 1~25까지의 수가 한 번씩 적혀 있습니다.사회자가 25개의 수를 한 번씩 부를 때,각 수가 불릴 때마다 빙고판에서 해당 수를 지웁니다.가로, 세로, 대각선 중 5개가 모두 지워진 줄이 3개 이상이 되는 순간철수는 "빙고!"를 외치게 됩니다.사회자가 몇 번째 수를 부른 후 빙고가 완성되는지 구하는 문제입니다.접근 방식빙고판과 사회자가 부르는 수의 순서를 2차원 리스트로 입력받습니다.각 숫자가 불릴 때마다, 빙고판에서 해당 숫자를 찾아 체크합니다.매번 가로, 세로, 두 대각선에 대해5개가 모두 체크된 줄(빙고 줄)의 개수를 셉니다.빙고 줄이 3개 이상이 되는 순간,그때까지 부른 수의 개수를 출력하고 종료합니다.실생활 비유로 설명하면,"빙고판에 체크 표시를 하면서가로, 세로, 대각선..
[백준 / 2239 / Python] 스도쿠
·
Algorithm/백준
문제 요약9×9 크기의 스도쿠 보드가 주어집니다.각 행, 각 열, 그리고 3×3 박스마다 1~9가 중복 없이 한 번씩만 등장해야 합니다.아직 채워지지 않은 칸은 0으로 주어지며,모든 빈 칸을 조건에 맞게 채운 "가장 사전순으로 앞서는" 해답을 출력하는 문제입니다.접근 방식이 문제는 대표적인 "백트래킹" 유형입니다.먼저, 빈 칸(0)의 좌표를 모두 저장합니다.각 빈 칸에 대해 1~9 중 가능한 숫자를 하나씩 시도합니다.숫자를 넣었을 때 행, 열, 3×3 박스에 중복이 없으면 다음 칸으로 진행합니다.만약 모든 빈 칸을 채웠다면, 그 즉시 답을 출력하고 탐색을 종료합니다(사전순 보장).불가능하면 백트래킹(원상복구)하여 다른 숫자를 시도합니다.실생활 비유로 설명하면,"빈 칸마다 1~9 중 가능한 숫자를 하나씩 ..
[백준 / 17404 / Python] RGB거리 2
·
Algorithm/백준
문제 요약N개의 집이 일렬로 있고, 각 집을 빨강, 초록, 파랑 중 하나로 칠해야 합니다.각 집을 각 색으로 칠하는 비용이 주어질 때, 1번 집의 색은 2번, N번 집의 색과 달라야 하고 N번 집의 색은 N-1번, 1번 집의 색과 달라야 하며 나머지 집도 인접한 집과 색이 달라야 합니다.이 조건을 모두 만족하면서 모든 집을 칠하는 최소 비용을 구하는 문제입니다.접근 방식이 문제는 "원형" 형태의 인접 제약이 추가된 RGB거리 문제입니다.즉, 1번 집과 N번 집도 서로 색이 달라야 하므로,단순한 DP로는 해결이 어렵고,1번 집의 색을 고정한 뒤, 1번 집을 빨강/초록/파랑 각각으로 칠하는 경우를 모두 시도 그에 따라 N번 집이 같은 색이 되지 않도록 DP를 돌려 세 경우 중 최소값을 정답으로 선..
[백준 / 2342 / Python] Dance Dance Revolution
·
Algorithm/백준
문제 요약DDR(Dance Dance Revolution) 게임에서,중앙(0)과 네 방향(1: 위, 2: 왼쪽, 3: 아래, 4: 오른쪽) 발판이 있습니다.처음엔 두 발 모두 중앙(0)에 있고, 주어진 스텝 순서대로 한 발씩 움직여야 합니다. 같은 위치에 두 발이 동시에 있을 수는 없습니다(시작 제외).한 발이 이미 해당 위치에 있다면, 그 발로 반복해서 눌러야 합니다.발을 움직일 때 드는 힘은 다음과 같습니다:중앙(0) → 다른 위치: 2같은 위치 반복: 1인접한 위치로 이동: 3반대편(예: 위↔아래, 왼↔오른) 이동: 4모든 스텝을 밟는 데 필요한 최소 힘을 구하는 문제입니다.접근 방식이 문제는 "상태"를 잘 정의해서 DP(동적 프로그래밍)로 해결해야 합니다.각 스텝마다, 왼발과 오른발이 각각 어디..
[백준 / 2143 / Python] 두 배열의 합
·
Algorithm/백준
문제 요약두 개의 정수 배열 A, B가 주어집니다.각 배열에서 연속된 부분 구간(부 배열)을 하나씩 골라,A의 부 배열의 합 + B의 부 배열의 합 = T가 되는 쌍의 개수를 구하는 문제입니다.예를 들어,A = [1, 3, 1, 2], B = [1, 3, 2], T = 5라면A의 부 배열과 B의 부 배열을 각각 골라 합이 5가 되는 경우의 수를 모두 세야 합니다.접근 방식처음에는 모든 부 배열 쌍을 직접 만들어 합을 비교하는 완전탐색을 떠올릴 수 있습니다.하지만 배열의 길이가 최대 1,000이므로,O(N² × M²) 방식은 시간 초과가 발생합니다.여기서 "부 배열의 합"이라는 조건에 주목하면,각 배열의 모든 부 배열 합을 미리 구해놓고,A의 부 배열 합 + B의 부 배열 합 = T즉, A의 부 배열 합이..