목록개발/algorithm (175)
https://www.acmicpc.net/problem/1487 해당 문제는 판매자가 최대 이윤을 남길 수 있는 판매가격을 구하는 문제이다. 소비자의 희망 구매 가격과 배송비를 고려하여 문제를 풀어야 한다. 아래는 반복문 고차함수(forEach), 와 누산 고차함수(reduce)를 이용한 풀이를 소개한다. const fs = require('fs') const input = fs.readFileSync(process.platform === "linux" ? "/dev/stdin":"입력.txt") .toString().trim().split('\n') function solution(data) { let [_, ...arr] = data.map(el=> el.split(' ').map(Number)) ..
https://www.acmicpc.net/problem/11586 해당 문제는 주어지는 '심리상태'에 따라 값을 출력하는 문제이다. (난이도 자체는 쉬운 편) 다만 '심리상태'에 따라 조건 분기를 해줘야 하는데 이 경우에 불필요하게 반복되는 코드가 많아져 코드를 읽기가 불편할 수가 있다. 이를 타파하기 위해 객체 안에 함수를 저장하여 조건분기를 했는데, 먼저 이를 적용하지 않은 코드를 살펴본다. const fs = require('fs') const input = fs.readFileSync(process.platform === "linux" ? "/dev/stdin":"입력.txt") .toString().trim().split('\n') function solution(data) { const [_..
https://www.acmicpc.net/problem/1388 // 입력 4 4 |--| |--| |--| |--| // 출력 6 문제에 제시된 예제를 사용하기에는 너무 단순하거나 오히려 길고 복잡하기에, 해당 블로그에서는 원활한 설명을 위해 예제를 만들었다. 문제에서 말했던 것처럼 연결된 막대기는 하나의 막대로 보기 때문에 좌우측 4개로 이어진 막대기 각각 하나씩, 가운데 2개로 이어진 막대 4개. 즉 총 6(2+4)개가 되는 것이다. 해당 문제를 풀이는, 특정한 점에서부터 막대의 시작과 끝을 처리한 뒤 이를 하나의 막대로 취급하기 위해 DFS 알고리즘으로 구현하였다. 2023.06.01 - [개발/algorithm] - 프로그래머스 - Lv.2 타겟넘버 / 깊이 우선 탐색(DFS)와 너비 우선 탐..
https://school.programmers.co.kr/learn/courses/30/lessons/49189 해당 문제는 문제 제목 말마따나, 루트 노트인 1에서 가장 먼 노드의 갯수를 찾는 문제다. 가장 거리가 먼 노드를 찾는 것이기에, DFS보다는 BFS가 더 문제 의도와 적합하다고 생각해 BFS로 접근했다. 2023.06.01 - [개발/algorithm] - 프로그래머스 - 타겟넘버 / 깊이 우선 탐색(DFS)와 너비 우선 탐색(BFS) 구현 방식 비교 생각한 풀이 방식은 다음과 같다. 각 노드끼리 이어진 그래프를 구현하고, [노드 번호, 거리] 를 인자로 하는 배열을 queue로 활용해 BFS 로직을 구현한다. 소스 코드 및 풀이 function solution(n, edge) { // 그..
https://www.acmicpc.net/problem/2910 이 문제는 그 말마따나 등장 빈도가 높은 순서대로 정렬, 등장 빈도가 같을 시 등장 순서대로 정렬하는 문제다. 문제를 해결하기 위해 객체에 각 숫자의 등장 빈도를 기록하고, 해당 객체를 정렬하는 방식으로 답을 구했다. // 입력값 // 5 2 // 2 1 2 1 2 const fs = require('fs') const input = fs.readFileSync(process.platform === "linux" ? "/dev/stdin":"입력.txt") .toString().trim().split('\n') function solution(data) { data.shift() // 객체 생성 const table = {} const a..
https://www.acmicpc.net/problem/1969 해당 문제를 쉽게 말하면, 주어지는 문자열 중 각 인덱스마다 가장 많은 빈도로 등장하는 알파벳(같은 빈도일 경우 사전순)을 채택하여 문자열을 만들며, (DNA) 문자열을 만들 때마다 (문자열의 갯수 - 채택된 문자열의 빈도 수) 를 누산하여 출력하는 문제다. (Hamming Distance) 나는 이를 단순하게 하기 위해, 먼저 배열 안에 객체를 넣어주었다. 이후 이중 반복문에서 들어오는 알파벳과 인덱스에 따라, 해당 인덱스를 가진 객체에 알파벳의 갯수를 추가할 수 있도록 구현했다. // 이때 M 은 문자열의 길이 = 8 const table = [] // 각 인덱스마다 배열 생성 for(let i = 0 ; i < M ; i ++) ta..
https://www.acmicpc.net/problem/11725 해당 문제는 그 말마따나 각 노드의 부모 노드를 구하는 문제다. 이 문제를 해결하기 위해 먼저 그래프를 구현한 다음, 너비우선탐색(BFS) 방식을 활용하여 1번 노드부터 차근차근 정답을 찾아나가고자 하였다. 그래프 구현 로직은 다음과 같다. // 노드의 갯수만큼 배열을 생성하고 const graph = Array.from({length : +N+1}, ()=> []) data.forEach((el)=> { // 연결된 노드를 그래프에 추가한다 const [to,from] = el.split(' ').map(Number) graph[to].push(from) graph[from].push(to) }) // 입력 예시대로 입력했을 경우 출력..
https://www.acmicpc.net/problem/1759 해당 문제는 몇 가지 알파벳을 제시한 후, 특정 조건(모음 1개 이상, 자음 2개 이상)을 만족하는 암호를 출력하는 문제다. 나는 산출할 수 있는 모든 조합을 만들 수 있는 백트래킹 로직과, 만들어진 조합을 검증하는 검증 로직 두 가지를 구현하여 문제를 해결하였다. const fs = require('fs') const input = fs.readFileSync(process.platform === "linux" ? "/dev/stdin":"입력.txt") .toString().trim().split('\n') // 검증 로직 const verify = (arr) => { // 모음 배열 const vowels = ['a','e','i',..