문제 링크 https://www.acmicpc.net/problem/20056 20056번: 마법사 상어와 파이어볼 첫째 줄에 N, M, K가 주어진다. 둘째 줄부터 M개의 줄에 파이어볼의 정보가 한 줄에 하나씩 주어진다. 파이어볼의 정보는 다섯 정수 ri, ci, mi, si, di로 이루어져 있다. 서로 다른 두 파이어볼의 위치 www.acmicpc.net 풀이 격자의 각 칸을 Node 구조체로, 현재 단계에 존재하는 파이어 볼을 Ball 구조체로 관리합시다. 각 구조체는 다음처럼 이루어져 있습니다. Ball - int x, y, w, d, s // 현재 좌표(x, y), 무게(w), 방향(d), 속력(s) - pair move() // 공의 방향으로 s만큼 이동한 뒤 곳의 좌표를 반환 Node { ..
문제 프로젝트를 진행하던 중에 this와 관련된 문제를 맞닥뜨렸습니다. 공부를 해도 해도 모르는 게 또 나오네요... 🤮🤮🤮 map() 함수 내의 콜백에서 사용된 this가 계속 undefined가 되어 버그가 나는 상황이었습니다. 당시 상황을 간략하게 보여주자면, class T { constructor() { this.arr = [1, 2, 3]; }; printThis() { console.log(this); }; bug() { this.arr.map(this.printThis); }; } const obj = new T(); console.log('========= printThis() ========='); obj.printThis(); console.log('========= bug() ====..
문제 링크 https://www.acmicpc.net/problem/21874 21874번: 모자 게임 CS-House에서는 매주 목요일에 연세대학교 컴퓨터과학과에 대한 여러 이야기를 팟캐스트 형식으로 다룬다. 2021년 3월 18일에 진행한 CS-House에서는 ICPC World Final에 진출한 윤인섭 선배가 게스트로 www.acmicpc.net 풀이 생각을 좀 해보다, 첫 사람이 전체에 대한 정보를 모두 줘야 한다고 판단했습니다. 처음에 모든 모자의 합을 알려주고, 각 사람은 내가 볼 수 있는 수와 지금까지 나왔던 수를 합에서 빼면 자기 모자의 수를 알 수 있습니다. 근데 수의 범위가 0 ~ 63입니다. 사람처럼 생각하면 덧셈, 뺄셈이 이상적이지만, 컴퓨터는 xor을 쉽게 할 수 있습니다. 처음..
문제 링크 https://www.acmicpc.net/problem/21873 21873번: 개구리 징검다리 건너기 첫 번째 줄에 개구리들을 움직여야 하는 횟수 $M$을 출력한다. 단, $M$은 $1\,500\,000$을 넘어서는 안된다. 두 번째 줄부터 $M$개의 줄에 걸쳐서 움직인 개구리의 정보를 순서대로 출력한다. $p$번째 www.acmicpc.net 풀이 그림으로 그려보다 화가나서 웹으로 간단한 시뮬레이터를 만들어 규칙을 찾았습니다. 사람은 시각에 예민한 동물입니다.. 1 1 2 1 2 3 ... 1 2 3 ... n 1 2 3 ... n 1 2 3 ... n 2 3 ... n 3 ... n ... n 이런 식으로 한 줄마다 이동해야 하는 개구리의 색이 바뀌게 됩니다. 정답 코드 const fs..
문제 링크 https://www.acmicpc.net/problem/21870 21870번: 시철이가 사랑한 GCD 첫째 줄에 정수 $N$이 주어진다. ($1 \leq N \leq 200\,000$) 둘째 줄에 자취방의 매물번호를 의미하는 정수 $a_1, a_2, \cdots, a_N$이 주어진다. ($1 \leq a_i \leq 200\,000$) www.acmicpc.net 풀이 각 단계마다 반으로 나눠진 배열의 왼쪽, 오른쪽 결과를 재귀적으로 모두 확인하면 됩니다. 재귀 호출의 깊이가 $O(logN)$이고, 각 레벨마다 gcd를 구하기 위해 모든 원소를 봐야 하므로 시간 복잡도는 $O(NlogN)$입니다. 정답 코드 const fs = require('fs'); const stdin = fs.rea..
문제 링크 https://www.acmicpc.net/problem/21869 21869번: Maximum Bishop 체스에는 대각선 방향으로 움직일 수 있는 비숍(bishop)이 있다. 다음 그림과 같은 $5\times5$ 정사각형 체스판 위의 B라고 표시된 곳에 비숍이 있을 때, 비숍은 대각선 방향으로 움직여 X로 표시된 www.acmicpc.net 풀이 간단하게 풀 수 있습니다. 첫 열의 모든 칸에 비숍을 깔아주고, 1행, n행을 제외한 마지막 열의 모든 칸에 비숍을 깔아주면 됩니다. 정답 코드 const fs = require('fs'); const stdin = fs.readFileSync('/dev/stdin').toString().split('\n'); const input = (() =>..
문제 링크 https://www.acmicpc.net/problem/21868 21868번: 미적분학 입문하기 첫 번째 줄에는 양수 $\epsilon$을 분수로 표현했을 때의 분자와 분모가 공백으로 구분되어 주어진다. 각 분자와 분모는 $1$ 이상 $10\,000$ 이하의 자연수다. 두 번째 줄에는 일차 이하의 다항함수 $f www.acmicpc.net 풀이 엡실론-델타 논법을 공부한지 좀 되어서 다음 글을 참고하였습니다. 엡실론 델타 논법(ε-δ 논법)으로 함수의 극한 더 잘 이해하기 - 류모찌 주어진 다항 함수를 다음처럼 씁시다. $$f(x) = ax + b$$ 문제에서 요구하는 $L$은 극한값이므로, 단순히 $f(x_0)$ 값을 구해주면 됩니다. 다음으론 $\delta$의 최댓값을 구해야합니다. 위..
문제 링크 https://www.acmicpc.net/problem/21867 21867번: Java Bitecode 첫째 줄에 코드의 길이를 나타내는 정수 $N$이 주어진다. ($1 \leq N \leq 200\,000$) 둘째 줄에 알파벳 대문자로 이루어진 코드 $S$가 주어진다. www.acmicpc.net 풀이 정규 표현식을 이용합시다. 문자열 내에 'J', 'A', 'V' 중 해당되는게 있다면 빈 문자열로 치환해주면 됩니다. 정답 코드 const fs = require('fs'); const stdin = fs.readFileSync('/dev/stdin').toString().split('\n'); const input = (() => { let line = 0; return () => std..
문제 링크 https://www.acmicpc.net/problem/21866 21866번: 추첨을 통해 커피를 받자 첫 번째 줄에 9개의 정수가 주어진다. 각 정수는 $0$ 이상 $1\,000$ 이하의 정수다. 각 정수는 해당 학생이 각 문제에서 얻은 점수를 의미한다. www.acmicpc.net 풀이 1) 점수의 합을 구해줍니다. 2) 최대 점수를 넘는 문제가 있는지 확인해줍니다. 3) 주어진 조건에 따라 정답을 출력합시다. 정답 코드 const fs = require('fs'); const stdin = fs.readFileSync('/dev/stdin').toString().split('\n'); const input = (() => { let line = 0; return () => stdin[..