문제 원본: https://leetcode.com/problems/concatenation-of-array/

문제

길이가 n인 정수 배열 nums가 주어졌을 때, ans[i] == nums[i]이고 ans[i + n] == nums[i]인 길이가 2n인 배열 ans를 만들어 반환하라. i의 범위는 0 <= i < n이다.

구체적으로 ansnums 배열 두 개를 합친 것이다.

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는 계속해서 순환할 것이다. 그렇게 inums의 길이 * 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이 차이가 날까?

댓글남기기