-
#AIL_24.01.04 // Programmers_같은 숫자는 싫어AIL( Algorithm I Learned) 2024. 1. 4. 22:21
## AIL_ 같은 숫자는 싫어
*** 문제 설명
배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면
arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.
배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.
*** 제한사항
배열 arr의 크기 : 1,000,000 이하의 자연수배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수
*** 입출력 예
arr answer [1,1,3,3,0,1,1] [1,3,0,1] [4,4,4,3,3] [4,3]
입출력 예 #1,2
문제의 예시와 같습니다.
## solution.JavaScript
1. 문제의 접근 방식
주어진 문제는 배열을 순회하면서 현재 원소가 이전 원소와 같지 않다면 answer 배열에 추가합니다. 배열을 순회하면서 현재 원소가 이전 원소와 같으면 스킵하고, 다르다면 answer 배열에 추가합니다.
2. 문제풀이
function solution(arr) { var answer = []; arr.forEach((value, index) => { if (index === 0 || value !== arr[index - 1]) { answer.push(value); } }); return answer; } /* 테스트 1 입력값 〉 [1, 1, 3, 3, 0, 1, 1] 기댓값 〉 [1, 3, 0, 1] 실행 결과 〉 테스트를 통과하였습니다. 테스트 2 입력값 〉 [4, 4, 4, 3, 3] 기댓값 〉 [4, 3] 실행 결과 〉 테스트를 통과하였습니다. */
1) function solution(arr) {: solution이라는 함수를 정의하고, 파라미터로 배열 arr을 받습니다.
2) var answer = [];: 빈 배열 answer를 선언합니다. 이 배열은 최종적으로 연속적으로 나타나는 숫자를 제거한 결과를 담을 것입니다.
3) arr.forEach((value, index) => {: 배열 arr를 순회하면서 각 원소에 대해 주어진 콜백 함수를 실행합니다. 콜백 함수는 현재 원소 value와 해당 원소의 인덱스 index를 인자로 받습니다.
- value: 현재 순회 중인 배열의 원소입니다. 각 순회에서 arr 배열의 원소가 value에 할당됩니다.
- index: 현재 순회 중인 배열의 원소의 인덱스입니다. 배열의 첫 번째 원소의 인덱스는 0이며, 순회가 진행됨에 따라 1씩 증가합니다. arr 배열의 각 원소에 대해 해당 원소의 인덱스가 index에 할당됩니다.
4) if (index === 0 || value !== arr[index - 1]) {: 현재 원소가 배열의 첫 번째 원소이거나 현재 원소가 이전 원소와 다를 경우에 아래의 블록을 실행합니다.
- index === 0: 현재 원소가 배열의 첫 번째 원소인 경우.
- value !== arr[index - 1]: 현재 원소가 이전 원소와 다른 경우.
위 두 조건 중 하나라도 만족하면 아래의 블록을 실행합니다.
5) answer.push(value);: 현재 원소를 answer 배열에 추가합니다. 즉, 연속적으로 나타나는 숫자 중 첫 번째 숫자만 answer 배열에 추가됩니다.
6) return answer;: 최종적으로 구성된 answer 배열을 반환합니다.
이 함수는 배열을 순회하면서 연속적으로 나타나는 숫자를 제거한 후, 남은 숫자들을 순서대로 담은 배열을 반환합니다.
3. 다른사람의 문제풀이 및 접근방식 분석
function solution(arr) { return arr.filter((val,index) => val != arr[index+1]); } /* 테스트 1 입력값 〉 [1, 1, 3, 3, 0, 1, 1] 기댓값 〉 [1, 3, 0, 1] 실행 결과 〉 테스트를 통과하였습니다. 테스트 2 입력값 〉 [4, 4, 4, 3, 3] 기댓값 〉 [4, 3] 실행 결과 〉 테스트를 통과하였습니다. */
1) arr.filter((val, index) => val != arr[index + 1]): 배열 arr을 순회하면서, 현재 원소 val과 다음 원소 arr[index + 1]를 비교합니다.
2) val != arr[index + 1]: 현재 원소가 다음 원소와 다를 경우에만 true를 반환하고, 같을 경우에는 false를 반환합니다.
3) 이렇게 반환된 true인 원소들만 새로운 배열에 남게 되어, 연속적으로 나타나는 숫자가 제거된 배열이 생성됩니다.
4) 최종적으로 새로운 배열이 반환됩니다.
이 코드는 주어진 문제를 해결하는 데에도 효과적이며, filter 함수를 이용하여 한 줄로 간결하게 작성되어 있습니다.
'AIL( Algorithm I Learned)' 카테고리의 다른 글
#AIL_24.01.09 // Programmers_가장 가까운 같은 글자 (1) 2024.01.09 #AIL_24.01.08 // Programmers_두 개 뽑아서 더하기 (0) 2024.01.08 #AIL_24.01.03 // Programmers_크기가 작은 부분 문자열 (0) 2024.01.03 #AIL_23.12.30 // Programmers_삼총사 (0) 2023.12.30 #AIL_23.12.21 // Programmers_호텔 대실********** (0) 2023.12.21