본문 바로가기

CodingTest

[LeetCode] Max Consecutive Ones

지난번에는 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