지난번에는 String에 대한 문제를 풀었고
이번에는 Array에 대한 문제를 풀어보기로 했다.
Max Consecutive Ones
Given a binary array nums, return the maximum number of consecutive 1's in the array.
Example 1:
Input: nums = [1,1,0,1,1,1]
Output: 3
Explanation: The first two digits or the last three digits are consecutive 1s. The maximum number of consecutive 1s is 3.
Example 2:
Input: nums = [1,0,1,1,0,1]
Output: 2
Constraints:
- 1 <= nums.length <= 105
- nums[i] is either 0 or 1.
문제는 간단하다.
배열의 반복되는 숫자 1 중에 최대값을 구하는 것이다.
순차적으로 배열을 돌면서 0일 때 초기화되고, 1이 반복되는 숫자 중 최대값을 구한다.
나의 풀이
var findMaxConsecutiveOnes = function(nums) {
let maxNum = 0;
let count = 0;
for(let i=0; i<nums.length; i++) {
nums[i] == 1 ? count++ : count = 0;
if(count > maxNum) {
maxNum = count;
}
}
return maxNum;
};
단순히 for문을 돌면서 1일 때 카운트 수를 늘리고, 0일 때 카운트 수를 초기화한다.
그 이후 카운트 수와 최대값을 비교한 후 카운트 수가 크다면 최대값을 교체한다.
배열을 다 돌고 나면 반복된 숫자 1 중에 제일 큰 카운트 수가 maxNum 변수에 있게 된다.
간단히 배열을 순환하면서 최대값을 구하는 문제였고
이번에도 신기한 풀이를 발견했다.
var findMaxConsecutiveOnes = function(nums) {
return Math.max(...nums.join("").split(0).map(e=> e.length))
};
하나씩 살펴본다면..
nums 배열을 join 함수를 통해서 문자열로 바꾼 후 split 함수를 통해 0을 기준으로 다시 분리해 배열로 만든다.
Example 1 문제로 해보면 ["11", "111"]와 같은 값이 생기고 map을 통해서 각각의 length 값의 배열을 다시 반환시킨다.
그러면 [3, 2]이 반환되고 spread 문법을 통해서 Math.max 함수를 실행 후 배열의 최대값을 return 한다.
문자열과 배열로 변환하면서 간결한 코드로 완성한 풀이였다.
하지만 실행시간과 메모리 사용량이 많다는 것이 단점이었다.
단순한 문제이지만 다양한 풀이로 새로운 접근방식을 많이 배우는 게 되는 것 같다.
'CodingTest' 카테고리의 다른 글
[LeetCode] Third Maximum Number (0) | 2022.08.07 |
---|---|
[LeetCode] Longest Common Prefix (0) | 2022.07.16 |
[LeetCode] Valid Palindrome (0) | 2022.07.10 |