문제https://www.acmicpc.net/problem/16235 풀이이 문제는 구현 난이도는 그저 그랬으나 시간 복잡도를 신경써야 하는 문제였다. 기존 코드에서는 죽은 나무들을 담는 큐를 만들어 계산했지만, 이런 방식으로 풀이하면 시간 초과가 발생하므로 기존 나무를 담는 배열에 각 나무의 죽음 여부를 나타내는 값을 하나 추가하고 이를 활용해 풀이했다.추가적으로 내가 실수하며 풀이 시간이 40분 정도 증가했는데, 문제에서 입력으로 들어오는 X, Y 개념을 잘못 이해했다. 나는 좌표평면에서 세로를 Y, 가로를 X로 생각했다. 하지만 문제에서는 상단에서 떨어진 정도를 X, 맨 좌측에서 떨어진 정도를 Y로 표기했다. 이를 반대로 사용해 각 땅에 줘야하는 양분을 잘못 전달했었다. 코드const input..
JavaScript
문제https://www.acmicpc.net/problem/14891 풀이문제는 시뮬레이션 구현 문제이다. 문제 풀이는 돌아가는 톱니바퀴의 좌/우에 있는 톱니바퀴들의 회전후 동작을 구현하는데 중점을 두었다. 회전 동작을 담당하는 함수에서 좌/우에 있는 톱니바퀴들을 회전할 수 있는지 확인하며 회전시키는데, 이때 톱니바퀴는 서로 반대 방향으로 회전하므로 다음 톱니바퀴가 어느 방향으로 회전했는지를 변수에 기록해 그 다음 톱니바퀴가 회전할 방향을 계산할 수 있도록 프로그래밍 했다. 이 문제에서 가장 어려웠던 부분은 로직 구현이 아니였다......오타 때문에 30분 이상 사용한거같다.....length배열의 길이를 측정할 때 length가 아닌 lenght라 작성한 것이다... 오타를 조심하자...........
문제https://www.acmicpc.net/problem/3190 풀이뱀의 이동 매커니즘을 큐를 이용해 뱀의 이동 경로를 저장하고 이를 이용해 뱀의 길이 및 뱀의 위치를 계산한다. 코드const input = require('fs') .readFileSync(process.platform === 'linux' ? '/dev/stdin' : __dirname + '/example.txt') .toString().trim().split('\n').map(e => e.split(' '));const N = +input.shift()[0];const apple = +input.shift()[0];const applePos = input.splice(0, apple).map(e => e.map(Numbe..
문제https://www.acmicpc.net/problem/16234 풀이이 문제는 BFS를 학습하기 위해 풀어본 문제이며 이 문제를 통해 BFS를 조금 알기 시작했다.... 문제에서는 각 칸마다 연합을 연결할 수 있는 나라인지 확인한 뒤 계속 인접 칸으로 이동해야 한다. 이러한 풀이 방식에서 인접 노드 탐색을 진행하는 BFS를 적용해야한다. bfs 함수를 실행하는 이중 for문은 각 칸마다 연합을 만들 수 있는지 검증하는 경우를 구현하기위해 사용했고, 해당 노드가 방문했던 노드임을 나타내는 visited 배열을 생성했으며 이 배열을 bfs 함수에 전달해 함수 내부에서 방문 여부를 확인해 방문 하지 않고, 함수에서는 상하좌우 방향의 노드와 현 위치의 노드 간의 차이가 문제에서 주어진 범위 안에 있다면 ..
문제https://www.acmicpc.net/problem/14502 풀이이 문제는 BFS를 이용해 풀이했다. 바이러스가 확장되는 모습이 BFS의 인접한 노드를 모두 방문하는 로직과 비슷했기에 BFS를 이용했다. 하지만 벽을 세우는 로직은 DFS와 비슷하다. 모든 빈 공간 중 3 칸에 벽을 세우는 경우를 구현하는데에 DFS와 같은 모습을 갖는 3개의 for 반복문을 이용해 구현했다. 코드const input = require('fs') .readFileSync(process.platform === 'linux' ? '/dev/stdin' : __dirname + '/example.txt') .toString().trim().split('\n').map(e => e.split(' ').map(Numb..
문제https://www.acmicpc.net/problem/14890 풀이문제에 주어진 지도를 가로줄을 검증한다. 오른쪽의 블럭이 왼쪽 보다 클 경우는 이전까지의 평지의 길이를 비교해 경사로를 놓을 수 있으면 넘어가고, 왼쪽블럭이 더 큰 경우는 평지의 길이에서 미리 경사로 설치에 필요한 길이를 빼준다. 이 부분에 대해 설명하자면, 뒤에 평지가 나오면 더해지기 때문에 놓을 수 있다면 하나씩 늘어나 양수가 되지만 놓을 수 없다면(더 크거나 작은 블럭이 있는 경우) 음수가 되기 때문에 반복문을 탈출한다. 이후 가로 세로를 변경해 한번 더 반복한다. 코드const { link } = require('fs');const input = require('fs') .readFileSync(process.platfo..