[알고리즘 연습] 백준 20207 (달력, 자바스크립트)
·
알고리즘 연습
문제 20207번: 달력 수현이는 일년의 날짜가 1일부터 365일로 표시되어있는 달력을 가지고있다. 수현이는 너무나도 계획적인 사람이라 올 해 일정을 모두 계획해서 달력에 표시해놨다. 여름이 거의 끝나가자 장 www.acmicpc.net 풀이 문제에서 주어진 일정을 시작일을 기준으로 오름차순 정렬한다. calendar 배열을 통해 날짜마다 몇 개의 일정이 존재하는지 구한다. 연속적으로 일정이 존재하면 width를 계속 증가시키고 height는 최대값으로 변경한다. 중간에 일정이 끊어지면 width와 height를 초기화한다. 소스 코드 const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt"; const input = req..
[알고리즘 연습] 백준 7569 (토마토, 자바스크립트)
·
알고리즘 연습
문제 7569번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100, www.acmicpc.net 소스 코드 class Queue { constructor() { this.dat = []; this.head = 0; this.tail = 0; } push(item) { this.dat[this.tail++] = item; } pop() { this.head++; } front() { return this.dat[this.head]; } rear() { return this.dat[this.tail - 1]; } isEmpty() ..
[알고리즘 연습] 백준 20164 (홀수 홀릭 호석, 자바스크립트)
·
알고리즘 연습
문제 20164번: 홀수 홀릭 호석 호석이는 짝수랑 홀수 중에서 이니셜이 같은 홀수를 더 좋아한다. 운전을 하던 호석이는 앞차의 번호판이 홀수로 가득할 때 사랑스러움을 느낄 정도이다. 전화번호도 홀수만 있고 싶다. 그렇게 www.acmicpc.net 풀이 재귀를 돌면서 문자열의 길이에 따라 알맞은 동작을 수행한다. 문자열의 길이가 3 이상일 경우 3개의 문자열로 분리할 수 있는 모든 경우를 구한다. 홀수의 개수를 누적할 때는 계산이 완료된 숫자를 가지고 홀수의 개수를 구하기 때문에 문자열의 길이가 1인 경우 N 자체에 대해 홀수의 개수를 구한다. 소스 코드 const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt"; const..
[알고리즘 연습] 백준 7576 (토마토, 자바스크립트)
·
알고리즘 연습
문제 7576번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토 www.acmicpc.net 소스 코드 class Queue { constructor() { this.dat = []; this.head = 0; this.tail = 0; } push(item) { this.dat[this.tail++] = item; } pop() { this.head++; } front() { return this.dat[this.head]; } rear() { return this.dat[this.tail - 1]; } isEmpty() { re..
[알고리즘 연습] 백준 16926 (배열 돌리기 1, 자바스크립트)
·
알고리즘 연습
문제 16926번: 배열 돌리기 1 크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다. A[1][1] ← A[1][2] ← A[1][3] ← A[1][4] ← A[1][5] ↓ ↑ A[2][1] A[2][2] ← A[2][3] ← A[2][4] A[2][5] www.acmicpc.net 풀이 입력으로 주어진 N * M 배열을 R번 회전시킨 결과를 출력하는 문제이다. 회전은 반시계 방향으로 진행한다. 한번의 회전을 수행할 때 몇 개의 네모 형태를 회전 시켜야 하는지가 핵심인 문제였고 이를 구현하기 위해 min(N, M) / 2 공식을 이용했다. 처음에는 배열의 회전을 구현하기 위해 Queue를 사용하는 방법을 떠올렸다. 하지만, Queue를 사용하면..
[알고리즘 연습] 백준 2668 (숫자고르기, 자바스크립트)
·
알고리즘 연습
문제 2668번: 숫자고르기 세로 두 줄, 가로로 N개의 칸으로 이루어진 표가 있다. 첫째 줄의 각 칸에는 정수 1, 2, …, N이 차례대로 들어 있고 둘째 줄의 각 칸에는 1이상 N이하인 정수가 들어 있다. 첫째 줄에서 숫자를 적절 www.acmicpc.net 풀이 첫째 줄에서 숫자를 적절히 뽑으면, 그 뽑힌 정수들이 이루는 집합과, 뽑힌 정수들의 바로 밑의 둘째 줄에 들어있는 정수들이 이루는 집합이 일치한다. 이러한 조건을 만족시키도록 정수들을 뽑되, 최대로 많이 뽑는 방법을 구한다. 소스 코드 const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt"; const input = require("fs") .readFile..
[알고리즘 연습] 백준 14940 (쉬운 최단거리, 자바스크립트)
·
알고리즘 연습
문제 14940번: 쉬운 최단거리 지도의 크기 n과 m이 주어진다. n은 세로의 크기, m은 가로의 크기다.(2 ≤ n ≤ 1000, 2 ≤ m ≤ 1000) 다음 n개의 줄에 m개의 숫자가 주어진다. 0은 갈 수 없는 땅이고 1은 갈 수 있는 땅, 2는 목표지점이 www.acmicpc.net 풀이 지도의 크기 n * m 이며 0은 갈 수 없는 땅, 1은 갈 수 있는 땅, 2는 목표지점을 나타낸다. 각 지점에서 목표지점까지의 거리를 출력한다. 원래 갈 수 없는 땅인 위치는 0, 원래 갈 수 있는 땅인 부분 중에서 도달할 수 없는 위치는 -1을 출력한다. 목표지점에서 시작하는 BFS를 수행하여 갈 수 있는 모든 땅을 탐색하며 해당 땅에서 목표지점까지의 거리를 구한다. queue에 좌표를 저장할 때 cnt를..
[알고리즘 연습] 백준 2667 (단지번호붙이기, 자바스크립트)
·
알고리즘 연습
문제 2667번: 단지번호붙이기 과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여 www.acmicpc.net 풀이 2중 for문으로 값이 1인 위치를 찾는다. 이 때 총 단지수를 1증가시키고 해당 위치에서 시작하는 BFS를 수행한다. BFS를 통해 방문할 수 있었던 위치의 수를 반환한다. 한 번 방문한 위치는 다시는 방문할 수 없도록 값을 0으로 변경한다. 소스 코드 class Queue { constructor() { this.data = []; this.head = 0; this.tail = 0; } push(item) { this.data[this.tail++..
[알고리즘 연습] 백준 15787 (기차가 어둠을 헤치고 은하수를, 자바스크립트)
·
알고리즘 연습
문제 15787번: 기차가 어둠을 헤치고 은하수를 입력의 첫째 줄에 기차의 수 N(1 ≤ N ≤ 100000)과 명령의 수 M(1 ≤ M ≤ 100000)가 주어진다. 이후 두 번째 줄부터 M+1번째 줄까지 각 줄에 명령이 주어진다. www.acmicpc.net 풀이 N개의 기차의 20개의 열을 모두 0으로 초기화한다. M개의 명령을 모두 수행하여 기차의 상태를 변경한다. set 자료구조를 통해 중복되는 기차의 상태를 제거한다. 소스 코드 const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt"; const input = require("fs") .readFileSync(filePath) .toString() .trim() ..
[알고리즘 연습] 백준 21278 (호석이 두 마리 치킨, 자바스크립트)
·
알고리즘 연습
문제 21278번: 호석이 두 마리 치킨 위의 그림과 같이 1번과 2번 건물에 치킨집을 짓게 되면 1번부터 5번 건물에 대해 치킨집까지의 왕복 시간이 0, 0, 2, 2, 2 로 최소가 된다. 2번과 3번 건물에 지어도 동일한 왕복 시간이 나오지만 더 www.acmicpc.net 풀이 플로이드 와샬 알고리즘을 통해 모든 노드간 최단 거리를 구한다. 2곳에 치킨집이 존재할 수 있는 케이스를 모두 탐색해 최단 시간의 총합을 구한다. 소스 코드 const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt"; const input = require("fs") .readFileSync(filePath) .toString() .trim() ..