회고록 블로그

[LeetCode 코테 풀기] 1929. Concatenation of Array 본문

4. 기타 공부/코테 준비

[LeetCode 코테 풀기] 1929. Concatenation of Array

김간장 2022. 2. 13. 22:59

하루 1문제 정도는 꼭 알고리즘 문제를 풀고 잠들자고 다짐했건만,

올림픽 경기에 빠져버려서 하루만에 무산이 됐다.

다시 마음을 굳게 먹고

또 경기에 빠지기전에 LeetCode 사이트부터 열었다.


1929. Concatenation of Array

문제 해석:

여기 integer 배열 nums가 주어졌다. (길이는 n이다)

길이가 2n인 배열 ans를 만드세요.

이때, ans[i] == nums[i] 이고, ans[i+n] == nums[i] 입니다.

(0 <= i < n이고, 인덱스는 0부터 입니다)

ans는 nums 배열을 두번 연속한 것입니다. 리턴 값은 배열 ans입니다.

 

참고. 알고리즘에 풀이로 채택한 언어는 JavaScript이다.

 

문제출처 : https://leetcode.com/problems/concatenation-of-array/

 

Concatenation of Array - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

 

풀이:

* 본 글은 언어를 전혀 모르는 채로 맨 땅에 헤딩하며 공부하는게 컨셉(?)이기 때문에, 문법부터 하나씩 차근차근 필기 했다.

 

저번에 알고리즘 문제 풀면서, JS 변수 선언, 배열, 함수에 대해서는 약간 공부했으니 이번 필기에서는 생략한다.

2022.02.10 - [4. 기타 공부/코테 준비] - [LeetCode 코테 풀기] 1920. Build Array from Permutation

 

[LeetCode 코테 풀기] 1920. Build Array from Permutation

라피신을 끝내고 다시 코딩 독학을 하기 위해 돌아왔다. 본래 백준 코테를 조금씩 풀고 있었지만, LeetCode로 옮겨왔다. 해외 취업이나 그런 이유는 아니고, 그냥 Discuss의 위치가 눈에 딱 보이는 곳

cinnamonc.tistory.com

대신 배열에 대해서 좀 더 찾아서 필기하기로 했다.

1) JS 배열 초기화

일단 배열 선언은 아래와 같이 할 수 있다.

let num = [];

배열의 길이를 정할 수도 있는데, 아래와 같이 코드를 작성한다.

num.length = (2 * nums.length);

 

배열 초기화에 대해서 알아보다가 아래의 글을 찾았는데 (=> 배열의 요소 값을 지우는/초기화하는 방법)

나중에 언젠간 유용하게 이용할 것 같다.

https://blog.smilecat.dev/posts/array-clear

 

[JS] 배열 초기화 방법들

The endless quitter's blog.

blog.smilecat.dev

2) 배열 값 대입

반복문을 이용한 방법도 있고, push 메서드를 이용한 방법도 있다.

가장 기본적으로, 반복문을 이용한 방법을 보면 아래와 같다.

for (let i = 0; i< nums.length; i++)
        ans[i] = nums[i];

 

이 방법들을 잘 이용하면 코드를 작성할 수 있을 것 같다.

 


제출한 답안 :

가장 기본적인 방법으로 코드를 작성해서 제출했다.

더 빠르고 짧은 코드를 생각해 봤지만 아는게 없어서 모르겠다.

차라리 잘하는 분들의 코드를  보며 공부하는게 더 나을 거라고 생각되어서 빨리 코드를 제출하고 Discuss를 보기로 했다.

 

런타임은 121ms가 나왔다. 생각보다 빠르지 않다.

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var getConcatenation = function(nums) {
    let ans = [];
    ans.length = 2 * nums.length;
    for (let i = 0; i< nums.length; i++) {
            ans[i] = nums[i];
            ans[i + nums.length] = nums[i];
    }
    return (ans);
};

좋은 코드 학습:

the_golden_panther님의 코드

https://leetcode.com/problems/concatenation-of-array/discuss/1369400/JavaScript-or-one-liner

 

점이 3개 있길래 오타인 줄 알았는데, 이것도 JavaScript의 문법 중 하나였다.

아래의 글에 의하면 점 3개는 "rest parameter"와 "spread opertaor"로써 사용될 수 있다고 한다.

또한 글을 읽어보니, ES6에서 추가된 문법으로 추정된다.

 

1. 점 3개 의미

https://dinn.github.io/javascript/js-dotdotdot/

 

JavaScript | JS에서 점점점(…)은 무엇일까?

Rest Paramenter와 Spread Operator에 대해 알아보겠습니다.

dinn.github.io

 

 

다른 코드들도 공부하는데 굉장히 도움이 되어서 기록해 놓으려고 한다.

 

아래 URL의 코드도 굉장히 좋았다. 이해하는데 어려운 코드는 아니다.

NDvBHr님과 shsv382님의 코드

https://leetcode.com/problems/concatenation-of-array/discuss/1663664/Easy-Solution-must-try-**

원본 배열(nums)을 함부로 건드리면 안되겠다는 생각 때문에, 위와 같은 방법으로 접근할 생각을 못했다.

굳은 내 머리를 깨워주는데 큰 도움을 준 코드였던 것 같다.

 

아래의 코드도 굉장히 인상깊었다.

sronin님 코드

https://leetcode.com/problems/concatenation-of-array/discuss/1610317/Easy-to-Read-One-and-Two-Line-Solutions.

 

forEach 메서드와 push를 이용해서 nums 배열의 값을 변경하고 리턴!

map 메서드와의 차이점이 궁금해서 찾아봤는데, map 메서드는 값을 리턴받아 새로운 배열을 만드는 것이고

forEach문은 배열의 요소를 순회해서 접근하는 것이라고 한다.

 

아래 글을 참고하면 좋을 것 같다.

https://bigtop.tistory.com/58

 

[JavaScript] 자바스크립트 forEach 메서드 이해하기

ForEach 메서드란? forEach() 메서드는 배열에 활용이 가능한 메서드로, 파라미터로 주어진 함수를 배열 요소 각각에 대해 실행하는 메서드이다. map() 메서드와 거의 비슷하지만 차이점은 따로 return

bigtop.tistory.com

 

사담이지만, 사실 문제를 풀어보면서

저번에 배운 화살표 함수와 map 메서드를 이용해서 코드를 구성해봤었다.

하지만 아래와 같이 잘못된 결과가 출력됐다.

왜 그런걸까 계속 혼자 곰곰히 생각해봤는데

그 이유가 위의 URL(https://bigtop.tistory.com/58) 에서 말한 것처럼

"map 메서드는 값을 리턴해서 새로운 배열을 만들기 때문"이라는 것을 알게 됐다..

 

오늘도 한 수 배워갑니다.

Comments