
⭐ intro : 문제를 생각해나간 방식
모종의 DNA 배열 (진짜인지는 모르겠지만 뭐 비슷하것지...)이 주어질때, 특정 패턴이 반복되는것을 찾아내서 어떤 패턴이 존재하는지 뱉어내는 함수를 만드는 문제이다. 특정 조건값의 길이가 정해져있으므로 (length === 10) 인덱스가 하나씩 증가하면서 10개씩 비교해나가며 중복값을 찾아내면 되는데, 아무래도 '중복'값을 지정해야하니 Map이나 Set을 이용하면 될 것 같다. 한번 풀어보도록 하자.
⭐ 풀이과정
먼저 기본적인 에러처리로, s값이 10미만일 경우 빈값이 리턴될 수 있도록 한다. 왜냐하면 DNA 코드는 10개부터 시작하므로... 그리고 조각조각 잘라둔 객체 tmp와 응답값을 모아둔 객체 res를 지정해둔다.
var findRepeatedDnaSequences = function(s) {
if (s.length < 10) return [];
const tmp = new Set();
const res = new Set();
}
다음으로 전체 DNA 배열을 받아오는 s 문자열을 순회하되, 맨 마지막 10개 이전만큼 순회하도록 한다. 왜냐하면 한번 돌때마다 0번째부터 9번째까지 순회하면서 그다음 10개, 그다음 10개를 순회하게 되므로 마지막 10개 이전만큼 순회해야지 모든 값을 순회할 수 있게 된다. 그래서 slice메서드로 0번째부터 10번째까지 잘라서 현재값 now를 지정하고, Set의 메서드인 has()와 add()를 이용하여 현재 값을 모아두는 tmp와 응답값을 모아둔 res에 조건에 맞게끔 넣도록 한다. 맨처음 빈값 tmp에 기본값들을 넣어두고 두번이상 똑같은 호출된 요소를 발견할 경우 res에 값들을 모아두는 조건이다. 이후 res값을 모아둔 Set()객체를 배열로 전환해서 output으로 리턴하면 코드 완성이다.
for (let i = 0; i < s.length - 9; i++) {
let now = s.slice(i, i + 10);
if (tmp.has(now)) {
res.add(now);
} else {
tmp.add(now);
}
}
return Array.from(res.keys());
⭐ 제출답안
var findRepeatedDnaSequences = function(s) {
if (s.length < 10) return [];
const tmp = new Set();
const res = new Set();
for (let i = 0; i < s.length - 9; i++) {
let now = s.slice(i, i + 10);
if (tmp.has(now)) {
res.add(now);
} else {
tmp.add(now);
}
}
return Array.from(res.keys());
};
⭐ 공부했던 개념들
맵과 셋
ko.javascript.info