목록분류 전체보기 (316)

https://www.acmicpc.net/problem/11478 문제는 단순한 편이다. 중복 처리는 지난 포스팅에서 활용했던 set() 을 사용하면 되고, 문자열 자르는 것은 substr 메서드를 활용했다. 이전까지는 대부분 slice를 활용해 문자열을 잘랐는데 왜 substr 메서드를 사용했느냐 묻는다면, slice 메서드는 slice(시작 인덱스, 끝 인덱스) 로 문자열을 자르는 것이고 substr 메서드는 substr(시작 인덱스, 자를 길이) 로 문자열을 자르는 것이기 때문에 이런 문제에서 더 직관적일 것이라는 생각이었다. 2023.01.13 - [개발/JavaScript] - JS - 반복문 심화2 (map / filter / sort / slice / substring / substr/sp..

https://www.acmicpc.net/problem/2563 문제는 주어진 입력값으로 영역을 구하는 문제다. 100 * 100 사이즈의 배열을 생성하고 반복문으로 영역이 포함되는 좌표를 '색종이가 덮은' 영역으로 처리해줄 수 있지만, 이 경우는 '덮은 영역 처리', '덮은 영역 확인'으로 두 번의 연산이 필요하기에 그리 좋은 방식은 아니다. 때문에 나는 좌표를, 중복된 데이터를 허용하지 않는 Set() 생성자를 활용해 문제를 해결했다. const fs = require('fs') const input = fs.readFileSync(process.platform === "linux" ? "/dev/stdin":"입력.txt") .toString().trim().split('\n') function ..

https://school.programmers.co.kr/learn/courses/30/lessons/42577 해당 문제는 주어진 배열에서 특정 단어가 다른 단어에 대해 '접두어'로 쓸 수 있을 때 false, 접 두어로 쓸 수 있는 단어가 없을 때는 true를 반환하는 문제다. 문제 자체는 간단해 보이나 주어지는 배열의 길이가 백만이기 때문에 시간 복잡도에 의한 실패에 유의해야 한다. 내가 생각한 방식은 다음과 같다. 먼저 해시로 활용할 객체를 만든다. 이후 길이가 긴 단어가 짧은 단어의 접두어가 될 수는 없으므로 길이가 짧은 순으로 정렬한 배열을 만든다. 정렬한 배열은 인덱스 순으로 해시 테이블에 추가하는 과정을 거치는데, 이때 반복문을 통해 앞에서부터 한글자씩 가져와 해당 단어가 이미 해시 테이..

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..