[Leet Code] 1929. Concatenation of Array
문제 원본: https://leetcode.com/problems/concatenation-of-array/
문제
길이가 n
인 정수 배열 nums
가 주어졌을 때, ans[i] == nums[i]
이고 ans[i + n] == nums[i]
인 길이가 2n
인 배열 ans
를 만들어 반환하라. i
의 범위는 0 <= i < n
이다.
구체적으로 ans
는 nums
배열 두 개를 합친 것이다.
Example 1:
Input: nums = [1,2,1]
Output: [1,2,1,1,2,1]
Explanation: The array ans is formed as follows:
- ans = [nums[0],nums[1],nums[2],nums[0],nums[1],nums[2]]
- ans = [1,2,1,1,2,1]
Example 2:
Input: nums = [1,3,2,1]
Output: [1,3,2,1,1,3,2,1]
Explanation: The array ans is formed as follows:
- ans = [nums[0],nums[1],nums[2],nums[3],nums[0],nums[1],nums[2],nums[3]]
- ans = [1,3,2,1,1,3,2,1]
Constraints:
n == nums.length
1 <= n <= 1000
1 <= nums[i] <= 1000
접근 방법
파이썬과 C#/자바의 풀이로 나눠서 생각했다.
우선 파이썬의 경우, 리스트끼리 더하기 연산을 하면 리스트가 합쳐지기 때문에 더하기 연산을 이용했다.
C#과 자바의 경우, 리스트 연산이 없기 때문에 직접 반복문을 돌며 처리하는 걸 생각했다.
핵심은 i
의 인덱스 처리를 어떻게 할 지인데, 어차피 nums
에서의 i
는 순환한다고 봤다. 예를 들어 i
가 0부터 2까지이면, 0 1 2 0 1 2 식으로 순환이 될 것이다. i
가 다시 nums
의 0번째를 가리키려면 nums
의 길이만큼 i
가 증가했어야 하므로, i % nums의 길이
를 해준다면 i
는 계속해서 순환할 것이다. 그렇게 i
를 nums의 길이 * 2
만큼 반복문을 돌며 처리를 한다.
풀이
Java
class Solution {
public int[] getConcatenation(int[] nums) {
int ansLen = 2 * nums.length;
int[] ans = new int[ansLen];
for (int i = 0; i < ansLen; i++)
ans[i] = nums[i % nums.length];
return ans;
}
}
- Runtime: 2ms
- Memory: 50.2MB
C#
public class Solution {
public int[] GetConcatenation(int[] nums) {
int ansLen = 2 * nums.Length;
int[] ans = new int[ansLen];
for (int i = 0; i < ansLen; i++)
ans[i] = nums[i % nums.Length];
return ans;
}
}
- Runtime: 177ms
- Memory: 45.4MB
Python
class Solution:
def getConcatenation(self, nums: List[int]) -> List[int]:
ans = nums + nums
return ans
- Runtime: 138ms
- Memory: 14.2MB
근데 이거 자바랑 C#은 같은 코드나 다름 없는데 왜 Runtime이 차이가 날까?
댓글남기기