/* 배열 초기화 */vararr[5]int// Go에서 길이를 지정하면([5]int) 배열이고, 지정하지 않으면([]int) 슬라이스다// Go 배열의 길이는 컴파일 시 결정되도록 설계되었으므로 상수로만 길이를 지정할 수 있다// 용량 확장 메서드 extend()를 쉽게 구현하기 위해 아래에서는 슬라이스(Slice)를 배열(Array)로 간주한다nums:=[]int{1,3,2,5,4}
/* 배열 초기화 */letarr:[i32;5]=[0;5];// [0, 0, 0, 0, 0]letslice:&[i32]=&[0;5];// Rust에서 길이를 지정하면([i32; 5]) 배열이고, 지정하지 않으면(&[i32]) 슬라이스다// Rust 배열의 길이는 컴파일 시 결정되도록 설계되었으므로 상수로만 길이를 지정할 수 있다// Vector는 Rust에서 일반적으로 동적 배열로 사용하는 자료형이다// 용량 확장 메서드 extend()를 쉽게 구현하기 위해 아래에서는 vector를 배열(array)로 간주한다letnums:Vec<i32>=vec![1,3,2,5,4];
배열 원소는 연속된 메모리 공간에 저장되므로 메모리 주소를 매우 쉽게 계산할 수 있다. 배열의 메모리 주소(첫 원소의 메모리 주소)와 원소의 인덱스가 주어지면, 아래 그림(4-2)의 식으로 해당 원소의 메모리 주소를 구하여 직접 접근할 수 있다.
그림 4-2 배열 원소의 메모리 주소 계산
위 그림(4-2)에서 배열의 첫 원소 인덱스는 \(0\)이다. \(1\)부터 세는 편이 더 자연스러워 보이므로 직관에 어긋날 수 있다. 그러나 주소 계산식의 관점에서 인덱스는 본질적으로 메모리 주소의 오프셋이다. 첫 원소의 주소 오프셋은 \(0\)이므로 인덱스가 \(0\)인 것은 합리적이다.
배열의 원소 접근은 매우 효율적이며, 어떤 원소든 \(O(1)\) 시간에 임의 접근할 수 있다.
array.py
defrandom_access(nums:list[int])->int:"""원소에 임의 접근"""# 구간 [0, len(nums)-1]에서 숫자 하나를 무작위로 뽑는다random_index=random.randint(0,len(nums)-1)# 무작위 원소를 가져와 반환한다random_num=nums[random_index]returnrandom_num
array.cpp
/* 원소에 임의 접근 */intrandomAccess(int*nums,intsize){// 구간 [0, size)에서 무작위로 수 하나 선택intrandomIndex=rand()%size;// 무작위 원소를 가져와 반환한다intrandomNum=nums[randomIndex];returnrandomNum;}
array.java
/* 원소에 임의 접근 */intrandomAccess(int[]nums){// 구간 [0, nums.length)에서 숫자 하나를 무작위로 뽑는다intrandomIndex=ThreadLocalRandom.current().nextInt(0,nums.length);// 무작위 원소를 가져와 반환한다intrandomNum=nums[randomIndex];returnrandomNum;}
array.cs
/* 원소에 임의 접근 */intRandomAccess(int[]nums){Randomrandom=new();// 구간 [0, nums.Length)에서 무작위로 수 하나 선택intrandomIndex=random.Next(nums.Length);// 무작위 원소를 가져와 반환한다intrandomNum=nums[randomIndex];returnrandomNum;}
array.go
/* 원소에 임의 접근 */funcrandomAccess(nums[]int)(randomNumint){// 구간 [0, nums.length)에서 숫자 하나를 무작위로 뽑는다randomIndex:=rand.Intn(len(nums))// 무작위 원소를 가져와 반환한다randomNum=nums[randomIndex]return}
array.swift
/* 원소에 임의 접근 */funcrandomAccess(nums:[Int])->Int{// 구간 [0, nums.count)에서 숫자 하나를 무작위로 뽑는다letrandomIndex=nums.indices.randomElement()!// 무작위 원소를 가져와 반환한다letrandomNum=nums[randomIndex]returnrandomNum}
array.js
/* 원소에 임의 접근 */functionrandomAccess(nums){// 구간 [0, nums.length)에서 숫자 하나를 무작위로 뽑는다constrandom_index=Math.floor(Math.random()*nums.length);// 무작위 원소를 가져와 반환한다constrandom_num=nums[random_index];returnrandom_num;}
array.ts
/* 원소에 임의 접근 */functionrandomAccess(nums:number[]):number{// 구간 [0, nums.length)에서 숫자 하나를 무작위로 뽑는다constrandom_index=Math.floor(Math.random()*nums.length);// 무작위 원소를 가져와 반환한다constrandom_num=nums[random_index];returnrandom_num;}
array.dart
/* 원소에 임의 접근 */intrandomAccess(List<int>nums){// 구간 [0, nums.length)에서 숫자 하나를 무작위로 뽑는다intrandomIndex=Random().nextInt(nums.length);// 무작위 원소를 가져와 반환한다intrandomNum=nums[randomIndex];returnrandomNum;}
array.rs
/* 원소에 임의 접근 */fnrandom_access(nums:&[i32])->i32{// 구간 [0, nums.len())에서 숫자 하나를 무작위로 뽑는다letrandom_index=rand::thread_rng().gen_range(0..nums.len());// 무작위 원소를 가져와 반환한다letrandom_num=nums[random_index];random_num}
array.c
/* 원소에 임의 접근 */intrandomAccess(int*nums,intsize){// 구간 [0, size)에서 무작위로 수 하나 선택intrandomIndex=rand()%size;// 무작위 원소를 가져와 반환한다intrandomNum=nums[randomIndex];returnrandomNum;}
array.kt
/* 원소에 임의 접근 */funrandomAccess(nums:IntArray):Int{// 구간 [0, nums.size)에서 숫자 하나를 무작위로 뽑는다valrandomIndex=ThreadLocalRandom.current().nextInt(0,nums.size)// 무작위 원소를 가져와 반환한다valrandomNum=nums[randomIndex]returnrandomNum}
array.rb
### 원소에 임의 접근 ###defrandom_access(nums)# 구간 [0, nums.length)에서 숫자 하나를 무작위로 뽑는다random_index=Random.rand(0...nums.length)# 무작위 원소를 가져와 반환한다nums[random_index]end
배열 원소는 메모리에서 ‘빈틈없이 붙어 있어’ 사이에 다른 데이터를 넣을 공간이 없다. 아래 그림(4-3)과 같이 배열 중간에 원소를 삽입하려면 해당 위치 이후의 모든 원소를 한 칸씩 뒤로 옮긴 다음, 그 인덱스에 새 원소를 대입해야 한다.
그림 4-3 배열에 원소를 삽입하는 예
배열의 길이는 고정되어 있으므로 원소를 하나 삽입하면 반드시 마지막 원소가 ‘사라진다’는 점에 주의하자. 이 문제의 해결책은 ‘리스트’ 절에서 다룬다.
array.py
definsert(nums:list[int],num:int,index:int):"""배열의 인덱스 index에 원소 num 삽입"""# 인덱스 index와 그 뒤에 있는 모든 원소를 한 칸씩 뒤로 이동한다foriinrange(len(nums)-1,index,-1):nums[i]=nums[i-1]# index 위치의 원소에 num을 대입한다nums[index]=num
array.cpp
/* 배열의 인덱스 index에 원소 num 삽입 */voidinsert(int*nums,intsize,intnum,intindex){// 인덱스 index와 그 뒤에 있는 모든 원소를 한 칸씩 뒤로 이동한다for(inti=size-1;i>index;i--){nums[i]=nums[i-1];}// index 위치의 원소에 num을 대입한다nums[index]=num;}
array.java
/* 배열의 인덱스 index에 원소 num 삽입 */voidinsert(int[]nums,intnum,intindex){// 인덱스 index와 그 뒤에 있는 모든 원소를 한 칸씩 뒤로 이동한다for(inti=nums.length-1;i>index;i--){nums[i]=nums[i-1];}// index 위치의 원소에 num을 대입한다nums[index]=num;}
array.cs
/* 배열의 인덱스 index에 원소 num 삽입 */voidInsert(int[]nums,intnum,intindex){// 인덱스 index와 그 뒤에 있는 모든 원소를 한 칸씩 뒤로 이동한다for(inti=nums.Length-1;i>index;i--){nums[i]=nums[i-1];}// index 위치의 원소에 num을 대입한다nums[index]=num;}
array.go
/* 배열의 인덱스 index에 원소 num 삽입 */funcinsert(nums[]int,numint,indexint){// 인덱스 index와 그 뒤에 있는 모든 원소를 한 칸씩 뒤로 이동한다fori:=len(nums)-1;i>index;i--{nums[i]=nums[i-1]}// index 위치의 원소에 num을 대입한다nums[index]=num}
array.swift
/* 배열의 인덱스 index에 원소 num 삽입 */funcinsert(nums:inout[Int],num:Int,index:Int){// 인덱스 index와 그 뒤에 있는 모든 원소를 한 칸씩 뒤로 이동한다foriinstride(from:nums.count-1,to:index,by:-1){nums[i]=nums[i-1]}// index 위치의 원소에 num을 대입한다nums[index]=num}
array.js
/* 배열의 인덱스 index에 원소 num 삽입 */functioninsert(nums,num,index){// 인덱스 index와 그 뒤에 있는 모든 원소를 한 칸씩 뒤로 이동한다for(leti=nums.length-1;i>index;i--){nums[i]=nums[i-1];}// index 위치의 원소에 num을 대입한다nums[index]=num;}
array.ts
/* 배열의 인덱스 index에 원소 num 삽입 */functioninsert(nums:number[],num:number,index:number):void{// 인덱스 index와 그 뒤에 있는 모든 원소를 한 칸씩 뒤로 이동한다for(leti=nums.length-1;i>index;i--){nums[i]=nums[i-1];}// index 위치의 원소에 num을 대입한다nums[index]=num;}
array.dart
/* 배열의 인덱스 index에 원소 _num 삽입 */voidinsert(List<int>nums,int_num,intindex){// 인덱스 index와 그 뒤에 있는 모든 원소를 한 칸씩 뒤로 이동한다for(vari=nums.length-1;i>index;i--){nums[i]=nums[i-1];}// 인덱스 index의 원소에 _num을 대입한다nums[index]=_num;}
array.rs
/* 배열의 인덱스 index에 원소 num 삽입 */fninsert(nums:&mut[i32],num:i32,index:usize){// 인덱스 index와 그 뒤에 있는 모든 원소를 한 칸씩 뒤로 이동한다foriin(index+1..nums.len()).rev(){nums[i]=nums[i-1];}// index 위치의 원소에 num을 대입한다nums[index]=num;}
array.c
/* 배열의 인덱스 index에 원소 num 삽입 */voidinsert(int*nums,intsize,intnum,intindex){// 인덱스 index와 그 뒤에 있는 모든 원소를 한 칸씩 뒤로 이동한다for(inti=size-1;i>index;i--){nums[i]=nums[i-1];}// index 위치의 원소에 num을 대입한다nums[index]=num;}
array.kt
/* 배열의 인덱스 index에 원소 num 삽입 */funinsert(nums:IntArray,num:Int,index:Int){// 인덱스 index와 그 뒤에 있는 모든 원소를 한 칸씩 뒤로 이동한다for(iinnums.size-1downToindex+1){nums[i]=nums[i-1]}// index 위치의 원소에 num을 대입한다nums[index]=num}
array.rb
### 배열의 인덱스 index에 원소 num 삽입 ###definsert(nums,num,index)# 인덱스 index와 그 뒤에 있는 모든 원소를 한 칸씩 뒤로 이동한다foriin(nums.length-1).downto(index+1)nums[i]=nums[i-1]end# index 위치의 원소에 num을 대입한다nums[index]=numend
마찬가지로 아래 그림(4-4)과 같이 인덱스 \(i\)의 원소를 삭제하려면 인덱스 \(i\) 뒤의 원소를 모두 한 칸씩 앞으로 옮겨야 한다.
그림 4-4 배열에서 원소를 삭제하는 예
삭제가 끝난 뒤 원래의 마지막 원소는 ‘의미 없는’ 값이 되므로 따로 수정할 필요가 없다.
array.py
defremove(nums:list[int],index:int):"""인덱스 index에 있는 원소 삭제"""# 인덱스 index 뒤에 있는 모든 원소를 한 칸씩 앞으로 이동한다foriinrange(index,len(nums)-1):nums[i]=nums[i+1]
array.cpp
/* 인덱스 index에 있는 원소 삭제 */voidremove(int*nums,intsize,intindex){// 인덱스 index 뒤에 있는 모든 원소를 한 칸씩 앞으로 이동한다for(inti=index;i<size-1;i++){nums[i]=nums[i+1];}}
array.java
/* 인덱스 index에 있는 원소 삭제 */voidremove(int[]nums,intindex){// 인덱스 index 뒤에 있는 모든 원소를 한 칸씩 앞으로 이동한다for(inti=index;i<nums.length-1;i++){nums[i]=nums[i+1];}}
array.cs
/* 인덱스 index에 있는 원소 삭제 */voidRemove(int[]nums,intindex){// 인덱스 index 뒤에 있는 모든 원소를 한 칸씩 앞으로 이동한다for(inti=index;i<nums.Length-1;i++){nums[i]=nums[i+1];}}
array.go
/* 인덱스 index에 있는 원소 삭제 */funcremove(nums[]int,indexint){// 인덱스 index 뒤에 있는 모든 원소를 한 칸씩 앞으로 이동한다fori:=index;i<len(nums)-1;i++{nums[i]=nums[i+1]}}
array.swift
/* 인덱스 index에 있는 원소 삭제 */funcremove(nums:inout[Int],index:Int){// 인덱스 index 뒤에 있는 모든 원소를 한 칸씩 앞으로 이동한다foriinnums.indices.dropFirst(index).dropLast(){nums[i]=nums[i+1]}}
array.js
/* 인덱스 index에 있는 원소 삭제 */functionremove(nums,index){// 인덱스 index 뒤에 있는 모든 원소를 한 칸씩 앞으로 이동한다for(leti=index;i<nums.length-1;i++){nums[i]=nums[i+1];}}
array.ts
/* 인덱스 index에 있는 원소 삭제 */functionremove(nums:number[],index:number):void{// 인덱스 index 뒤에 있는 모든 원소를 한 칸씩 앞으로 이동한다for(leti=index;i<nums.length-1;i++){nums[i]=nums[i+1];}}
array.dart
/* 인덱스 index에 있는 원소 삭제 */voidremove(List<int>nums,intindex){// 인덱스 index 뒤에 있는 모든 원소를 한 칸씩 앞으로 이동한다for(vari=index;i<nums.length-1;i++){nums[i]=nums[i+1];}}
array.rs
/* 인덱스 index에 있는 원소 삭제 */fnremove(nums:&mut[i32],index:usize){// 인덱스 index 뒤에 있는 모든 원소를 한 칸씩 앞으로 이동한다foriinindex..nums.len()-1{nums[i]=nums[i+1];}}
array.c
/* 인덱스 index에 있는 원소 삭제 */// 주의: stdio.h가 remove라는 이름을 사용한다voidremoveItem(int*nums,intsize,intindex){// 인덱스 index 뒤에 있는 모든 원소를 한 칸씩 앞으로 이동한다for(inti=index;i<size-1;i++){nums[i]=nums[i+1];}}
array.kt
/* 인덱스 index에 있는 원소 삭제 */funremove(nums:IntArray,index:Int){// 인덱스 index 뒤에 있는 모든 원소를 한 칸씩 앞으로 이동한다for(iinindex..<nums.size-1){nums[i]=nums[i+1]}}
array.rb
### 인덱스 index에 있는 원소 삭제 ###defremove(nums,index)# 인덱스 index 뒤에 있는 모든 원소를 한 칸씩 앞으로 이동한다foriinindex...(nums.length-1)nums[i]=nums[i+1]endend
대부분의 프로그래밍 언어에서는 인덱스로 배열을 순회할 수도 있고, 배열의 각 원소를 직접 얻으며 순회할 수도 있다.
array.py
deftraverse(nums:list[int]):"""배열 순회"""count=0# 인덱스를 통해 배열을 순회한다foriinrange(len(nums)):count+=nums[i]# 배열의 원소를 직접 순회한다fornuminnums:count+=num# 데이터의 인덱스와 원소를 함께 순회한다fori,numinenumerate(nums):count+=nums[i]count+=num
array.cpp
/* 배열 순회 */voidtraverse(int*nums,intsize){intcount=0;// 인덱스를 통해 배열을 순회한다for(inti=0;i<size;i++){count+=nums[i];}}
array.java
/* 배열 순회 */voidtraverse(int[]nums){intcount=0;// 인덱스를 통해 배열을 순회한다for(inti=0;i<nums.length;i++){count+=nums[i];}// 배열의 원소를 직접 순회한다for(intnum:nums){count+=num;}}
array.cs
/* 배열 순회 */voidTraverse(int[]nums){intcount=0;// 인덱스를 통해 배열을 순회한다for(inti=0;i<nums.Length;i++){count+=nums[i];}// 배열의 원소를 직접 순회한다foreach(intnuminnums){count+=num;}}
array.go
/* 배열 순회 */functraverse(nums[]int){count:=0// 인덱스를 통해 배열을 순회한다fori:=0;i<len(nums);i++{count+=nums[i]}count=0// 배열의 원소를 직접 순회한다for_,num:=rangenums{count+=num}// 데이터의 인덱스와 원소를 함께 순회한다fori,num:=rangenums{count+=nums[i]count+=num}}
array.swift
/* 배열 순회 */functraverse(nums:[Int]){varcount=0// 인덱스를 통해 배열을 순회한다foriinnums.indices{count+=nums[i]}// 배열의 원소를 직접 순회한다fornuminnums{count+=num}// 데이터의 인덱스와 원소를 함께 순회한다for(i,num)innums.enumerated(){count+=nums[i]count+=num}}
array.js
/* 배열 순회 */functiontraverse(nums){letcount=0;// 인덱스를 통해 배열을 순회한다for(leti=0;i<nums.length;i++){count+=nums[i];}// 배열의 원소를 직접 순회한다for(constnumofnums){count+=num;}}
array.ts
/* 배열 순회 */functiontraverse(nums:number[]):void{letcount=0;// 인덱스를 통해 배열을 순회한다for(leti=0;i<nums.length;i++){count+=nums[i];}// 배열의 원소를 직접 순회한다for(constnumofnums){count+=num;}}
array.dart
/* 배열 원소 순회 */voidtraverse(List<int>nums){intcount=0;// 인덱스를 통해 배열을 순회한다for(vari=0;i<nums.length;i++){count+=nums[i];}// 배열의 원소를 직접 순회한다for(int_numinnums){count+=_num;}// forEach 메서드로 배열을 순회한다nums.forEach((_num){count+=_num;});}
array.rs
/* 배열 순회 */fntraverse(nums:&[i32]){letmut_count=0;// 인덱스를 통해 배열을 순회한다foriin0..nums.len(){_count+=nums[i];}// 배열의 원소를 직접 순회한다_count=0;for&numinnums{_count+=num;}}
array.c
/* 배열 순회 */voidtraverse(int*nums,intsize){intcount=0;// 인덱스를 통해 배열을 순회한다for(inti=0;i<size;i++){count+=nums[i];}}
array.kt
/* 배열 순회 */funtraverse(nums:IntArray){varcount=0// 인덱스를 통해 배열을 순회한다for(iinnums.indices){count+=nums[i]}// 배열의 원소를 직접 순회한다for(jinnums){count+=j}}
array.rb
### 배열 순회 ###deftraverse(nums)count=0# 인덱스를 통해 배열을 순회한다foriin0...nums.lengthcount+=nums[i]end# 배열의 원소를 직접 순회한다fornuminnumscount+=numendend
복잡한 시스템 환경에서는 배열 바로 뒤의 메모리 공간을 사용할 수 있다고 보장하기 어려우므로, 배열 용량을 안전하게 늘릴 수 없다. 따라서 대부분의 프로그래밍 언어에서 배열 길이는 바꿀 수 없다.
배열 용량을 늘리려면 더 큰 배열을 새로 만들고 기존 원소를 차례로 복사해야 한다. 이는 \(O(n)\) 연산으로, 배열이 매우 크면 시간이 많이 든다. 코드는 다음과 같다.
array.py
defextend(nums:list[int],enlarge:int)->list[int]:"""배열 길이 확장"""# 길이를 확장한 배열을 초기화한다res=[0]*(len(nums)+enlarge)# 원래 배열의 모든 원소를 새 배열에 복사한다foriinrange(len(nums)):res[i]=nums[i]# 확장한 새 배열을 반환한다returnres
array.cpp
/* 배열 길이 확장 */int*extend(int*nums,intsize,intenlarge){// 길이를 확장한 배열을 초기화한다int*res=newint[size+enlarge];// 원래 배열의 모든 원소를 새 배열에 복사한다for(inti=0;i<size;i++){res[i]=nums[i];}// 메모리 해제delete[]nums;// 확장한 새 배열을 반환한다returnres;}
array.java
/* 배열 길이 확장 */int[]extend(int[]nums,intenlarge){// 길이를 확장한 배열을 초기화한다int[]res=newint[nums.length+enlarge];// 원래 배열의 모든 원소를 새 배열에 복사한다for(inti=0;i<nums.length;i++){res[i]=nums[i];}// 확장한 새 배열을 반환한다returnres;}
array.cs
/* 배열 길이 확장 */int[]Extend(int[]nums,intenlarge){// 길이를 확장한 배열을 초기화한다int[]res=newint[nums.Length+enlarge];// 원래 배열의 모든 원소를 새 배열에 복사한다for(inti=0;i<nums.Length;i++){res[i]=nums[i];}// 확장한 새 배열을 반환한다returnres;}
array.go
/* 배열 길이 확장 */funcextend(nums[]int,enlargeint)[]int{// 길이를 확장한 배열을 초기화한다res:=make([]int,len(nums)+enlarge)// 원래 배열의 모든 원소를 새 배열에 복사한다fori,num:=rangenums{res[i]=num}// 확장한 새 배열을 반환한다returnres}
array.swift
/* 배열 길이 확장 */funcextend(nums:[Int],enlarge:Int)->[Int]{// 길이를 확장한 배열을 초기화한다varres=Array(repeating:0,count:nums.count+enlarge)// 원래 배열의 모든 원소를 새 배열에 복사한다foriinnums.indices{res[i]=nums[i]}// 확장한 새 배열을 반환한다returnres}
array.js
/* 배열 길이 확장 */// JavaScript의 Array는 동적 배열이므로 직접 확장할 수 있다// 학습의 편의를 위해 이 함수에서는 Array를 길이가 고정된 배열로 취급한다functionextend(nums,enlarge){// 길이를 확장한 배열을 초기화한다constres=newArray(nums.length+enlarge).fill(0);// 원래 배열의 모든 원소를 새 배열에 복사한다for(leti=0;i<nums.length;i++){res[i]=nums[i];}// 확장한 새 배열을 반환한다returnres;}
array.ts
/* 배열 길이 확장 */// TypeScript의 Array는 동적 배열이므로 직접 확장할 수 있다// 학습의 편의를 위해 이 함수에서는 Array를 길이가 고정된 배열로 취급한다functionextend(nums:number[],enlarge:number):number[]{// 길이를 확장한 배열을 초기화한다constres=newArray(nums.length+enlarge).fill(0);// 원래 배열의 모든 원소를 새 배열에 복사한다for(leti=0;i<nums.length;i++){res[i]=nums[i];}// 확장한 새 배열을 반환한다returnres;}
array.dart
/* 배열 길이 확장 */List<int>extend(List<int>nums,intenlarge){// 길이를 확장한 배열을 초기화한다List<int>res=List.filled(nums.length+enlarge,0);// 원래 배열의 모든 원소를 새 배열에 복사한다for(vari=0;i<nums.length;i++){res[i]=nums[i];}// 확장한 새 배열을 반환한다returnres;}
array.rs
/* 배열 길이 확장 */fnextend(nums:&[i32],enlarge:usize)->Vec<i32>{// 길이를 확장한 배열을 초기화한다letmutres:Vec<i32>=vec![0;nums.len()+enlarge];// 원래 배열의 모든 원소를 새 배열로 복사한다res[0..nums.len()].copy_from_slice(nums);// 확장한 새 배열을 반환한다res}
array.c
/* 배열 길이 확장 */int*extend(int*nums,intsize,intenlarge){// 길이를 확장한 배열을 초기화한다int*res=(int*)malloc(sizeof(int)*(size+enlarge));// 원래 배열의 모든 원소를 새 배열에 복사한다for(inti=0;i<size;i++){res[i]=nums[i];}// 확장한 공간 초기화for(inti=size;i<size+enlarge;i++){res[i]=0;}// 확장한 새 배열을 반환한다returnres;}
array.kt
/* 배열 길이 확장 */funextend(nums:IntArray,enlarge:Int):IntArray{// 길이를 확장한 배열을 초기화한다valres=IntArray(nums.size+enlarge)// 원래 배열의 모든 원소를 새 배열에 복사한다for(iinnums.indices){res[i]=nums[i]}// 확장한 새 배열을 반환한다returnres}
array.rb
### 배열 길이 확장 #### Ruby의 Array는 동적 배열이므로 직접 확장할 수 있다# 학습의 편의를 위해 이 함수에서는 Array를 길이가 고정된 배열로 취급한다defextend(nums,enlarge)# 길이를 확장한 배열을 초기화한다res=Array.new(nums.length+enlarge,0)# 원래 배열의 모든 원소를 새 배열에 복사한다foriin0...nums.lengthres[i]=nums[i]end# 확장한 새 배열을 반환한다resend