Javascript 7

JavaScript는 싱글스레드인데 어떻게 동시에 여러 일을 할까?

JavaScript는 싱글스레드입니다. JavaScript를 사용하는 사람들이라면 분명히 들어본 말입니다. 그런데 이상하지 않나요? fetch('https://api.example.com/data') // 서버에서 데이터 가져오는 중console.log('로딩중...') // 이건 바로 실행됨updateAnimation() // 애니메이션도 돌아감 분명 API 호출하고, 로그 찍고, 애니메이션 돌리고... 동시에 여러 일이 일어나는데요? 스레드가 하나면 한 번에 한 가지만 할 수 있는 거 아닌가요? "비동기 처리를 하니까 가능하다"는 건 알겠는데, 그게 대체 어떻게 가능한 건지 이해가 잘 안 됩니다. 비동기는 말 그대로 동시에 여러 작업을 하는 거잖아요. 싱글스레드가 어떻게 동시에 여러 일을 하죠?..

[백준/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)이 코..

호이스팅? 생각보다 쉽습니다

호이스팅의 개념호이스팅(Hoisting)은 영어로 "끌어올리다"라는 뜻입니다. 쉽게 비유하자면, 선생님이 출석을 부를 때를 생각해보면 됩니다. 선생님은 수업 시작하기 전에 이미 출석부에 학생 이름이 다 적혀있어야 합니다. 수업 중간에 "어? 이 학생 이름이 없네?"라고 하면 안됩니다. JavaScript도 마찬가지입니다. 코드를 실행하기 전에 JavaScript 엔진이 코드를 쭉 훑어보면서 "어떤 변수들과 함수들이 있는지"를 미리 파악합니다. 이때 변수와 함수 선언을 코드의 최상단으로 끌어올리는 것처럼 동작하는 게 호이스팅입니다. 정확한 정의: 변수 및 함수 선언이 스코프(유효범위)의 최상단으로 끌어올려지는 JavaScript 동작 방식 호이스팅의 의의왜 이런게 있을까요? 호이스팅은 JavaScrip..

[백준/Node.js] 11720번: 숫자의 합

문제 URL: https://www.acmicpc.net/problem/11720 숫자들을 한 자리씩 쪼개서 다 더하는 문제입니다. 입력 처리const input = require('fs').readFileSync('/dev/stdin').toString()const lines = input.split('\n')const nums = lines[1].split('')lines[0]에는 숫자 개수 n이 있지만, 사실 안 써도 됩니다.lines[1]이 실제 숫자 문자열 (ex: "12345")split('')으로 한 글자씩 쪼개면 ['1', '2', '3', '4', '5'] 이런 배열이 됩니다. 숫자 더하기 - 두 가지 방법방법 1: forEachlet sum = 0nums.forEach(char => {..

[백준/Node.js] 11945번: 뜨거운 붕어빵

문제 URL: https://www.acmicpc.net/problem/11945 행렬을 좌우 반전시키는 문제입니다. 입력 처리const input = require('fs').readFileSync('/dev/stdin').toString()const lines = input.split('\n')const [n, m] = lines[0].split(' ').map(Number)여러 줄 입력은 split('\n')으로 배열로 만들기첫 줄에서 n(행), m(열) 추출map(Number)로 문자열 배열을 숫자 배열로 변환 문자열 뒤집기const row = lines[i].trim()const reversed = row.split('').reverse().join('')split(''): 문자열을 한 글자씩 ..

[백준/Node.js] 2438번: 별 찍기 - 1

백준 같은 온라인 저지에서 JavaScript로 문제를 풀 때 가장 먼저 막히는 게 입력 처리입니다. 브라우저용 언어인 JavaScript는 원래 prompt()로 입력을 받는데, 백준 서버에서는 이게 안됩니다. 입력 받는 코드const input = require('fs').readFileSync('/dev/stdin').toString().trim()require('fs'): Node.js에서 파일을 읽는 모듈.readFileSync('/dev/stdin'): 표준 입력(stdin)에서 데이터를 동기적으로 읽음.toString(): 읽은 바이너리 데이터를 문자열로 변환.trim(): 앞뒤 공백/줄바꿈 제거입력이 여러 줄이면 .split('\n')으로 나누면 됩니다.const input = requir..