문제 설명
자연수가 들어있는 배열 arr가 매개변수로 주어집니다. 배열 arr안의 숫자들 중에서 앞에 있는 숫자들부터 뒤에 중복되어 나타나는 숫자들 중복 횟수를 계산해서 배열로 return 하도록 solution 함수를 완성해주세요. 만약 중복되는 숫자가 없다면 배열에 -1을 채워서 return 하세요.
▶입출력 예 #1
arr = [1, 2, 3, 3, 3, 3, 4, 4]에서 3은 4번, 4는 2번씩 나타나므로 [4, 2]를 반환합니다.
▶입출력 예 #2
arr = [3, 2, 4, 4, 2, 5, 2, 5, 5]이면 2가 3회, 4가 2회, 5가 3회 나타나므로 [3, 2, 3]를 반환합니다.
▶입출력 예 #3
[3, 5, 7, 9, 1]에서 중복해서 나타나는 숫자는 없으므로 [-1]을 반환합니다.
##### 제한사항
- 배열 arr의 길이는 1 이상 100 이하의 자연수입니다.
- 배열 arr의 원소는 1 이상 100 이하의 자연수입니다.
본 프로그래밍 문항의 해설은 6월 14일(화)에 본 edwith 자가진단 페이지를 통해 공개 됩니다.
해설을 보기 전에 스스로 처음부터 문제를 해결할수 있는지 점검해보세요.
내 풀이
function solution (arr) {
const answer = [];
const set = new Set([]);
let cnt;
for(let i = 0; i < arr.length; i++){
cnt = 1;
if(set.has(arr[i])) continue;
set.add(arr[i]);
for(let j = i+1; j < arr.length; j++){
if(arr[i] === arr[j]) {
cnt++;
}
}
if(cnt > 1) answer.push(cnt);
}
return answer.length > 0 ? answer : -1;
}
// test code
console.log(`answer : `,solution([1, 2, 3, 3, 3, 3, 4, 4])); // answer : [4, 2]
console.log(`answer : `,solution([3, 2, 4, 4, 2, 5, 2, 5, 5])); // answer : [3, 2, 3]
console.log(`answer : `,solution([3, 5, 7, 9, 1])); // answer : [-1]
문제 해결 과정
앞에 있는 숫자를 순서로 배열을 탐색하면서 중복되는 숫자를 체크하기 위해 중복 되는 숫자를 체크해야하기 때문에 cnt 변수를 만들고, 이미 계산이 완료된 숫자에 대해서는 제외시켜야 하기 때문에 Set 을 이용해서 처리했다. 값을 순회하면서 중복되는 값이면 해당 반복문을 다음 분기로 넘겨서 다음 번호로 탐색되게 했다.
탐색을 마친 숫자에 대해 중복 숫자가 1을 초과한다면, 그것을 answer 배열에 cnt 값을 담도록 했고, 모든 배열의 순회를 마치면 answer 배열의 길이를 조건으로 해서 0을 초과하면 (빈 배열이 아니면), answer를 반환하고 그렇지 않으면 -1을 반환하도록 구현했다.
정답 및 해설
다른 풀이 방법 ( Map을 이용한 풀이 방법 )
function solution (arr) {
const answer = [];
const map = new Map();
arr.forEach(element => {
if(map.has(element)) { // 키 값을 지정했는지 확인하고 있으면, 중복 횟수 + 1
map.set(element, map.get((element)+1);
} else {
map.set(element, 1); // 지정되지 않은 키 값이라면 중복 횟수 1로 초기화
}
})
map.forEach((value) => {
if(value > 1) { // value 값이 1을 넘는 경우만 배열에 저장
answer.push(value);
}
})
return answer.length > 0 ? answer : -1; // answer 길이를 판별해서 answer 혹은 -1을 반환
}
// test code
console.log(`answer : `,solution([1, 2, 3, 3, 3, 3, 4, 4])); // answer : [4, 2]
console.log(`answer : `,solution([3, 2, 4, 4, 2, 5, 2, 5, 5])); // answer : [3, 2, 3]
console.log(`answer : `,solution([3, 5, 7, 9, 1])); // answer : [-1]
Set과 Map을 이용한 방법으로 나뉘어져 있으며, 그 중에서 Map을 이용한 방법에 대한 내용만 참고했다.
[ Link ] https://www.boostcourse.org/selfcheck/lecture/1421759?isDesc=false
부스트캠프 웹·모바일 자가진단
부스트코스 무료 강의
www.boostcourse.org