분류 전체보기 13

같은 문제, 다른 언어, 다른 생각 (자바와 자바스크립트)

Java 코드를 작성할 때와 JavaScript 코드를 작성할 때는 사고방식 자체가 달라진다. JavaScript에서는 주로 데이터를 어떻게 변형할 것인가를 고민하게 된다. 배열을 필터링하고, 원하는 형태로 매핑하고, 그룹화하거나 집계하여 최종 결과를 만들어내는 과정이 자연스럽다. 타입 제약이 적고 자료의 형태를 유연하게 바꿀 수 있기 때문에, 문제를 해결할 때도 데이터의 흐름과 변환 과정에 집중하게 된다. 예를 들어 JavaScript로 문제를 풀 때는 자연스럽게 이런 생각을 하게 된다."배열을 필터링하고""그 결과를 그룹핑하고""다시 매핑해서""최종 결과를 만들자" 그래서 map, filter, reduce, flatMap 같은 함수들을 사용하는 것이 권장되고, 또 자연스럽다.return users ..

개발/알고리즘 2026.06.16

정처기 강의 수강 중간점검

수강을 시작한지 11일이 지났다.시스템상 수강시작은 15일 이지만 교재가 16일에 도착했다.하루 2강씩 듣기로 계획을 세웠다. 오늘 27일 - 시작일 16일 = 11일 동안 22강을 들었다.문제풀이는 우선 풀고나서 잘 모르는 문제만 들어서 수월했다. 나는 비전공자이고 풀스택 개발 경력이 5년 차에 접어든다.강의 내용은 경험적으로 알고 있던 것들을 개념화 하는 느낌이었다.비전공자 대상 강의이다 보니 개념을 모른다는 가정하에 설명을 한다.이건 좋기도 나쁘기도 한데, 내가 모르는 게 나올 때는 좋다. 중요한 개념을 쉽게 외울 수 있는 두음 법칙 등으로내내 반복한다. 응집도 결합도는 듣고 그날 외운 것 같다. 응집도: (우)리 (논)던 (시)(절)에 먹던 (통)통한 (순)대 있잖아, (기)가 막히게 맛있었지. ..

개발/강의 2026.05.27

프로그래머스 파일명 정렬 문제

처음에는 아주 단순하게 풀었다.파일명을 비교할 때마다:소문자로 바꾸고정규식으로 HEAD / NUMBER 분리하고숫자로 변환한 뒤비교하는 방식이었다.대략 이런 느낌.function solution(files) { function parse(filename) { filename = filename.toLowerCase(); const regex = /^([^0-9]+)([0-9]+)(.*)$/i; const [, head, number] = filename.match(regex); return [ head, Number(number) ]; } return files.sort((a, b) => { const [headA, numbe..

카테고리 없음 2026.05.22

프로그래머스 주차 요금 계산

코딩테스트를 풀 때는 코드를 최대한 압축하고간결하게 쓰려고 노력하지만 이번 문제는 달랐다. 이번에 해결한 “주차 요금 계산” 문제는풀다보니 추상화 하고 싶은 욕구를 참을 수 없었다. 그래서 좀 과한 것 같지만 class 를 만들었다.코테를 이렇게 풀지 말라는 법은 없으니까....!!!! 핵심 아이디어문제를 다시 보면 사실 필요한 상태는 단순하다.차량별 누적 주차 시간현재 입차 시간지금 주차 중인지 여부이렇게 나눴다.this.records = new Map();this.parkingLot = new Set(); records는 차량별 기록 저장소, 아래와 같은 형태다:// entered: 입차시간, accTime: 누적 주차시간{ entered, accTime } 그리고 parkingLot은 현재 주차 ..

개발/알고리즘 2026.05.21

LZW 압축 문제: “가장 긴 문자열 찾기”

프로그래머스의 압축(LZW) 문제를 풀었다.처음엔 문제 이해를 잘못해서 삽질을 했다. 삽질 1: 현재 문자열과 다음 문자열의 범위이미 사전에 등록된 것이 있는지 확인하는 대상은 "현재 문자열"에만 한하는 것이었다.처음에는 현재 문자열 뒤에 붙일 대상도 사전에 등록된 문자열 단위라고 착각했다. 가령, 아래의 문자열이 사전에 등록되어 있다면:AKAOKA 착각했을 때는 "KAKAO"에서 "KAK" 다음에 "AO"를 붙여"KAKAO"를 사전에 등록하는 식으로 이해했다. 하지만 문제에서 말하는 w + c의 c는 사전에 있는 다음 문자열이 아니라,현재 문자열 바로 뒤의 한 글자였다. 삽질2: 길이 상관없이 찾기“현재 문자열이 사전에 있는지 검사하고, 있으면 그걸 쓰면 되잖아?”그래서 처음엔 이런 식으로 생각했다...

개발/알고리즘 2026.05.20

[프로그래머스] n진수 게임 JavaScript 풀이 — “누구 차례인가”만 생각하기

처음 문제를 읽었을 때는순서대로 숫자를 말하는 과정을 어떻게 구현해야 할지 조금 복잡하게 느껴졌다.독특한 규칙이 있었기 때문이다.두 자리수 이상이면 서로 1, 0, 1, 1, 1, 2 이렇게 자리수를 나눠 번갈아 말해야 했다. 참가자 수가 있고,각자 자신의 차례에 숫자를 말하며,튜브가 말해야 하는 문자만 추출해야 한다. 턴관리를 어떻게 해야할까 고민했다.추상화 하려면 실제로 어떻게 작동하는 지 보는게 도움이 된다.index를 순서대로 적고, 말해야 할 숫자와 프로토의 턴을 적었다.특정 index 가 주어졌을 때 프로도의 턴인지 확인하는 공식을 도출했다. 가령 숫자를 하나씩 10진수를 3명이 순서대로 말한다고 하자.index, 말해야하는 문자, P는 프로도 이다.index 0 → char 1 → Xi..

개발/알고리즘 2026.05.19

프로그래머스 더맵게 문제

프로그래머스 더 맵게 문제는정수인 스코빌 지수가 담긴 배열이 주어진다.숫자가 클수록 더 매운 음식이다. 가장 덜매운 지수 2개를 뽑아 주어진 공식으로 더 맵게 만들어야 하고,더 맵게 계산 된 새로운 지수와 남아 있는 지수들에서다시 가장 덜 매운 2개의 지수를 뽑아야 하는 문제다. 문제를 처음 봤을 때는 계산 된 결과도 포함하여다시 가장 덜 매운 두 개를 고르는 것이 아니라순차적으로 계산하는 것이라 생각했다. 그래서 우선 배열을 오름차순 정렬한 뒤,섞은 결과와 다음 작은 값을 골라 섞으며진행하면 되겠다고 생각했다. 하지만 문제와 예시를 더 자세히 보니더 맵게 만든 지수도 포함해서 작은 것을 골라야 했다. 예를 들어, 아래 배열이 주어진다면,[2, 3, 4, 6] 첫번째 두 수를 뽑아 예시의 공식에 따라 더..

카테고리 없음 2026.05.17

프로그래머스 뒤에 있는 큰 수 찾기 문제

문제를 처음 봤을 때는 단순 반복 탐색 문제처럼 보였다.각 숫자마다 오른쪽을 보면서자기보다 큰 수가 나오면 반환하는 로직을 떠올렸다. 예를들면:function solution(numbers) { return numbers.map((n, i) => { let closestGtNum = -1; for (let j = i + 1; j 하지만 이 방식은 각 숫자마다 뒤를 다시 탐색하기 때문에최악의 경우 O(n²) 시간이 걸린다.문제의 제한사항을 보니 numbers의 최대길이는 1,000,000개 였다. 길이 1,000,000개의 테스트가 주어지면 위 로직의 경우대략 1,000,000 * 1,000,000 / 2, 대략 5,000억번의 비교가 발생할 수 있다.(정확히는 length(..

개발/알고리즘 2026.05.16

프로그래머스 방문 길이 문제

프로그래머스의 방문 길이 문제를 풀었다.처음 문제를 읽었을 때는 단순 좌표 이동 문제처럼 보였지만,지나간 길(path)을 식별해야 하는 문제였다. 지나간 길을 어떻게 식별해야 할까 고민하면서실제 좌표를 적어보았다. A: [1, 0] B: [1, -1] 위와 같이 A, B 두 좌표를 서로 오갈 수 있는 길은A to B, B to A 는 모두 같은 길을 지난다.순서 무관하게 두 좌표를 관리하면 된다고 생각했다. 나는 두 좌표를 하나의 “경로 key”로 만들어 관리하기로 했다.const pathKey = (a, b) => { const p1 = `${a[0]},${a[1]}`; const p2 = `${b[0]},${b[1]}`; return p1 여기서 중요한 점은 방향성을 제거하는 것이었다.A:..

개발/알고리즘 2026.05.16

프로그래머스 뉴스 클러스터링

프로그래머스의 뉴스 클러스터링 문제를 풀었다.처음엔 집합 문제라고 생각했는데, 풀다 보니 실제로는 다중집합(multiset)을 구현하는 문제였다.처음에는 두 글자씩 끊어서 배열로 만든 뒤, includes를 이용해 교집합을 구하려고 했다.const intersection = set1.filter(el => str2.includes(el)); 하지만 곧 문제가 생겼다.예를 들어:["aa", "aa"]["aa"] 이 경우 교집합은 "aa" 하나만 있어야 한다.하지만 includes는 “존재 여부”만 확인하기 때문에 "aa" 두 개가 모두 교집합으로 들어가 버렸다.그제서야 문제를 다시 읽어보니, 이 문제는 일반 집합이 아니라 “다중집합”이었다. 즉 핵심은:원소가 존재하는가?가 아니라원소가 몇 개 존재하는가?였..

개발/알고리즘 2026.05.15