2026/01 4

tsx는 되는데 tsc는 안돼요: 유니언 타입 단언의 함정

// 런타임 코드let a = 3let b = ab.toUpperCase() // TypeError!​let a: number | string = 3let b = a as string이 코드를 tsx practice.ts로 실행하면? 잘 돌아갑니다. tsc practice.ts로 컴파일하면? 타입을 변환할 수 없다는 에러가 나옵니다. 어? a의 타입이 number | string 인데, string도 포함되어 있잖아? 왜 안돼? 이 의문을 풀려면 표면적인 문법이 아니라, TypeScript가 내부적으로 어떻게 동작하는지를 이해해야 합니다. 오늘은 코드 뒤에 숨은 원리를 파헤쳐보겠습니다. TypeScript의 가장 중요한 진실: 타입은 컴파일 타임에만 존재한다컴파일 타임 vs 런타임프로그램이 실행되는..

[백준/Node.js] 2583번: 영역 구하기

문제 URL: https://www.acmicpc.net/problem/2583 직사각형들로 덮인 공간을 제외하고, 빈 영역이 몇 개나 되는지, 각 영역의 넓이는 얼마인지 구하는 문제입니다. 핵심 개념 정리좌표 변환이 까다롭습니다. 문제에서 주는 수학 좌표계(왼쪽 아래가 원점)인데, 우리가 쓸 배열은 컴퓨터 좌표계(왼쪽 위가 원점)라서 y축을 뒤집어야 합니다. 이와 동시에 점으로 표현된 좌표들을 박스를 기준으로 변환하는 과정도 필요합니다. BFS로 영역을 탐색합니다. 0인 칸들이 상하좌우로 연결된 덩어리를 찾아내면 됩니다. JavaScript 특유의 함정들이 있습니다. 다른 언어 쓰다 온 사람들이 자주 헷갈리는 부분(저 포함ㅋ)들이 몇 가지 있어서, 이 글에서는 그런 부분들을 집중적으로 다뤄보겠습니다. ..

[백준/Node.js] 7568번: 덩치

문제 URL: https://www.acmicpc.net/problem/7568 순위를 매기는 문제입니다. 모든 사람을 다른 모든 사람과 비교해야 하는 전형적인 "완전탐색" 문제입니다. 문제 이해하기"덩치"는 키와 몸무게 둘 다 커야 인정됩니다. 키만 크거나 몸무게만 많이 나가면 안됩니다.A: 키 180, 몸무게 80B: 키 175, 몸무게 90A가 B보다 키는 크지만 몸무게는 적습니다. 그래서 둘은 비교 불가능합니다. 이런 경우 둘 다 1등이 될 수 있습니다. 입력 처리 - map과 타입 변환 주의const input = require('fs').readFileSync('/dev/stdin').toString()const lines = input.split('\n')const n = Number(li..

[백준/Node.js] 1676번: 팩토리얼 0의 개수

문제 URL: https://www.acmicpc.net/problem/1676 N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 문제입니다. 직관적이지만 node.js 에서는 불가능한 방법const input = require('fs').readFileSync('/dev/stdin').toString().trim()const n = parseInt(input)const revertToFac = function(n) { let fac = n for (let i = 1; i = 0; i--) { if (fac[i] === '0') { answer += 1 } else { break }}console.log(answer)이 코..