너무너무 멋져 눈이눈이 부셔
[JS] 백준 1969 DNA 자바스크립트 node.js 풀이 본문
문제
DNA란 어떤 유전물질을 구성하는 분자이다. 이 DNA는 서로 다른 4가지의 뉴클레오티드로 이루어져 있다(Adenine, Thymine, Guanine, Cytosine). 우리는 어떤 DNA의 물질을 표현할 때, 이 DNA를 이루는 뉴클레오티드의 첫글자를 따서 표현한다. 만약에 Thymine-Adenine-Adenine-Cytosine-Thymine-Guanine-Cytosine-Cytosine-Guanine-Adenine-Thymine로 이루어진 DNA가 있다고 하면, “TAACTGCCGAT”로 표현할 수 있다. 그리고 Hamming Distance란 길이가 같은 두 DNA가 있을 때, 각 위치의 뉴클오티드 문자가 다른 것의 개수이다. 만약에 “AGCAT"와 ”GGAAT"는 첫 번째 글자와 세 번째 글자가 다르므로 Hamming Distance는 2이다.
우리가 할 일은 다음과 같다. N개의 길이 M인 DNA s1, s2, ..., sn가 주어져 있을 때 Hamming Distance의 합이 가장 작은 DNA s를 구하는 것이다. 즉, s와 s1의 Hamming Distance + s와 s2의 Hamming Distance + s와 s3의 Hamming Distance ... 의 합이 최소가 된다는 의미이다.
입력
첫 줄에 DNA의 수 N과 문자열의 길이 M이 주어진다. 그리고 둘째 줄부터 N+1번째 줄까지 N개의 DNA가 주어진다. N은 1,000보다 작거나 같은 자연수이고, M은 50보다 작거나 같은 자연수이다.
출력
첫째 줄에 Hamming Distance의 합이 가장 작은 DNA 를 출력하고, 둘째 줄에는 그 Hamming Distance의 합을 출력하시오. 그러한 DNA가 여러 개 있을 때에는 사전순으로 가장 앞서는 것을 출력한다.
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=occidere&logNo=220857781286
[백준] 1969 - DNA
문제 링크: https://www.acmicpc.net/problem/1969 이 문제는 설명이 너무 복잡해서 이해하는데 주로 ...
blog.naver.com
참고했던 블로그이다.
난관1. 이게 무슨 소리인지 몰랐다. 뉴클레오티드 가 T,A,C,G로만 표현된다는 것도 문제에 있는데 제대로 안읽었다.
그리고, 하나하나씩 비교해가면서 DNA1번을 2,3,4,...번과 비교하고 DNA2번을 1,3,4 번과 비교하고... 이렇게 생각했는데 그럴 필요 없고 이중반복문으로
제일 Hamming Distance의 합 이 적은 문자 구하기 === 세로로 한 줄 씩 돌아가면서 가장 많이 나오는 문자를 찾아서 더해주기
이 생각을 못했다.
그리고 합의 최솟값은,
세로줄 한 줄 기준으로 문자열 개수 - 제일 가장 자주 등장하는 문자의 빈도 를하면 된다
난관2. Math.max()가 배열은 인자로 안받는 줄 몰랐다. 그래서 계속 답이 undefined가 떴다. 스프레드 연산자...를 활용해야 한다. Math.max([1,2,3,4])가 아니고 Math.max(1,2,3,4)가 되어야 한다.
const filePath = process.platform === 'linux' ?
'/dev/stdin' : './input.txt';
let input = require('fs').readFileSync(filePath).toString().trim().split("\n");
//모든 DNA의 M번쨰 위치에서 가장 많이 사용된 뉴
let [DNACnt, strLength] = input[0].split(" ").map(Number);
let nucles = ["A","C","G","T"];
let min_DNA = ''; //최소인 DNA
let min_cnt = 0; //최솟값
let DNAArr = []
// DNA 배열 만들어주기
for (let i=1; i<=DNACnt; i++){
DNAArr.push(input[i].trim())
}
// 합이 가장 작은 DNA === 각 위치에서 가장 많이 나오는 것.
// 이중 배열을 돌면서 같은게 나오면
for(let i=0; i<strLength; i++){
let cnt = [0,0,0,0];
for (let DNA of DNAArr){
if(DNA[i]==="A")++cnt[0];
else if(DNA[i]==="C")++cnt[1];
else if(DNA[i]==="G")++cnt[2];
else if(DNA[i]==="T")++cnt[3];
}
// 제일 많이 나온 숫자 찾기
let maxCnt = Math.max(...cnt); // 난관2 부분.
let maxIndex = cnt.indexOf(maxCnt)
min_DNA += nucles[maxIndex]; // 제일 많이 나온 숫자 결과에 더하기
min_cnt += DNACnt - maxCnt
}
console.log(min_DNA);
console.log(min_cnt)
'멋있는 JavaScript' 카테고리의 다른 글
[JS] 백준 1931 회의실 배정 자바스크립트 node.js 풀이 (0) | 2024.03.04 |
---|---|
[JS] 알고리즘 문제에 자주 사용되는데 내가 자꾸 까먹는 내장 함수 (0) | 2024.03.04 |
[JS]10799 쇠막대기 백준 자바스크립트 node.js (1) | 2024.02.25 |
[JS] 백준 16916 문자열 자바스크립트 KMP알고리즘 (0) | 2024.02.17 |
[JS] 백준 바이러스 자바스크립트 (1) | 2024.02.11 |