목록개발 (301)
https://school.programmers.co.kr/learn/courses/30/lessons/84512 해당 문제는 모음 A,E,I,O,U 를 조합하여 1~5 길이의 단어를 만들어 각각에 순서를 붙이고, 특정 문자열을 제시할 때 해당 문자열이 몇 번째 위치하는가에 대한 문제다. 먼저 A,E,I,O,U 를 조합하여 만들 수 있는 1~5가지의 문자열의 갯수는 3905(5^5 + 5^4 + 5^3 + 5^2 + 5^1)이기 때문에, 완전 탐색을 수행해도 높은 시간 복잡도가 우려되지는 않았다. 허나 이미 답에 맞는 문자열을 찾았음에도, 구태여 모든 탐색을 진행하는 것은 불필요하기에 내가 만든 문자열과 문제에서 제시된 문자열이 같다면 중지되도록 구현했다. 소스 코드 function solution(wo..
https://www.acmicpc.net/problem/1009 해당 문제는 백준에서 제시하는 난이도에 비해, 정답률이 낮은 문제라 포스팅하기로 했다. 문제는 컴퓨터 10대가 순차적으로 데이터를 처리한다고 하고 a^b 의 데이터가 주어졌다고 한다면, 마지막 데이터를 처리할 컴퓨터가 무엇인지 묻는다. 즉, a^b의 1의 자리 수를 묻는 문제로, 6^2 라는 데이터가 주어졌다면, 6 (36의 1의 자리 수)를 출력하면 된다. 하지만, 지수인 b의 최댓값이 100만이기 때문에 전체 수를 구한 뒤 1의 자리를 파악하는 것은 시간초과가 우려되고, 단순히 a의 1의 자리가 제곱될 때 어떤 규칙성을 가지고 있는지 파악하면 메모리와 시간을 아끼면서 풀이가 가능하다. 예를 들어, a가 각각 2 | 12 가 주어졌다고 ..
https://www.acmicpc.net/problem/10866 해당 문제는 배열로 풀이하는 것으로 접근했다가 시간 초과 문제가 발생했다. 입력값으로 들어오는 최대 명령 수가 1만 이하다보니, shift 메서드의 높은 시간복잡도 때문이었을 것이다. 그래서 class 객체를 사용해 연결 리스트를 구현하는 방법에 대해 찾아보았다. 참고한 링크 https://lhoiktiv.tistory.com/204?category=887263 const fs = require('fs') const input = fs.readFileSync(process.platform === "linux" ? "/dev/stdin":"입력.txt") .toString().trim().split('\n') // 연결리스트를 이루는 No..
https://www.acmicpc.net/problem/9322 해당 문제는 3개의 문자열 (공개키1, 공개키2, 암호문)이 주어질 때, 이를 활용하여 평문으로 복호화하여 출력하는 문제다. 공개키1의 문자열이 공개키2에서 어떤 패턴으로 구성되는지 파악하고, 이를 암호문에 적용하여 복호화하면 된다. 아래와 같은 예시로 설명한다. 공개키 1 : A B C D 공개키 2 : D A B C 암호문 : C B A P 인덱스 0 1 2 3 공개키1 A B C D 공개키2 D A B C 공개키1, 공개키2가 위와 같이 구성되어 있다고 할 때, 공개키1을 공개키2과 같은 패턴으로 암호화한다고 하면 다음과 같다. 인덱스 1 2 3 0 암호화 A B C D 즉, [0,1,2,3]으로 구성되어 있던 공개키1가, 공개키2와..
https://school.programmers.co.kr/learn/courses/30/lessons/17686 문제는 그 말마따나 정렬에 관한 문제다. 문자열이 주어졌을 때, 규칙에 따라 'head / number / tail' 로 나누고 정렬한 뒤 합치는 과정으로 진행했다. 문제가 길 뿐이지 단순할 것이라 생각했는데 생각보다 오래걸렸고, 덕분에 알게 된 사실도 있었다. 먼저 'head / number / tail'로 문자열을 매핑하는 과정에 대해 말한다. const verifyNum = (s) => { const nums = '0123456789' return nums.includes(s) } const mapping = files.map(str => { let [head,number,tail] =..
https://www.acmicpc.net/problem/1940 위에서 주어진 예제를 예를 들면, 해당 문제는 수들 [2,7,4,1,5,3]을 조합하여 9를 만드는 방법은 몇 가지가 있는지 출력하는 문제다. 이 경우, 정렬을 한 뒤 맨 앞의 값과 맨 뒤의 값을 합한 뒤, 우리가 원하는 값과 같은지 비교해가며 풀이하면 된다. 예를 들어, 주어진 수 [2,7,4,1,5,3]을 정렬한다. 이후 [1,2,3,4,5,7]로 정렬된 값에서 맨 앞수 '1'과 맨 뒷수'7'을 합하여 '9'와 비교한다. 이때 합쳐진 수 '8'는 '9'보다 작기 때문에, 앞에 있는 수 '1'은 제거한다. ('1'은 가장 큰 수 '7'과 합쳐도 원하는 수를 만들 수 없기 때문에 필요 없음) 만약 합친 수가 더 크면 큰 수를 제거, 동일하..
https://www.acmicpc.net/problem/2985 이 문제는 주어진 세 가지 수와, 사칙연산 기호 네 개 중 하나, 등호를 하나써서 만들 수 있는 올바른 등식을 출력하는 문제다. 따라서, 총 8번의 조건 분기가 필요하고, if문 또한 8번 사용해야 한다. 하지만 많은 if문을 사용하는 것을 싫어하는 나로서는 예전 포스팅에서 객체에 함수를 저장해 조건을 나누고 문제를 해결했던 것처럼, 이번에는 배열에 함수를 넣어 문제를 해결했다. 2023.09.11 - [개발/algorithm] - 백준 11586 - 지영 공주님의 마법 거울 (객체에 함수 저장) JS 소스 코드 const fs = require('fs') const input = fs.readFileSync(process.platform..
https://www.acmicpc.net/problem/1065 해당 문제는 문제에서 제시한 것처럼 '한수'의 갯수를 출력하는 문제다. 여기서 답에 대한 힌트는 예제에서 주어지는데, 100~110까지의 각 자릿수가 등차수열을 이루는 수는 존재하지 않으므로 100 미만의 모든 수는 한수라고 볼 수 있다. 그러므로 100 미만인 n이 주어진 경우 그대로 출력하고, 100 이상인 n이 주어지는 경우, 100부터 n까지의 한수의 수와 99(100 이하의 한수는 99개이므로) 합하여 출력하면 된다. const fs = require('fs') const input = fs.readFileSync(process.platform === "linux" ? "/dev/stdin":"입력.txt") .toString()..