본문 바로가기

Swift/Deep dive!!

[Swift] Array's enumerated(). 배열의 각 원소 index 가져오는 방법

 

 예전에도 map을 사용하면서 "index 지원 안하나?" 잠깐 생각해 본 적이 있지만,, 이번에 다익스트라 문제를 풀다가 "map을 쓸 때 element 랑 추가로 index는 동시에 사용 못 할까?" 에 해답을 찾게 되었습니다.

 

https://developer.apple.com/documentation/swift/repeated/enumerated()/

 

바로 이 함수입니다!! 

 

 평소에는 for in 구문을 통해서 배열의 첫 인덱스부터 마지막 인덱스까지 얻었습니다. map을 사용할 때는 index를 미리 선언하고 값을 증가하며 사용 했습니다. 이젠 이 함수를 사용하면 됩니다!!

 

https://developer.apple.com/documentation/swift/enumeratedsequence/

EnumeratedSequence를 반환 하는데 (n,x) 이렇게 쌍을 반환합니다.

여기서 n은 0 ~ Sequence.count-1까지 index를 의미합니다. x는 Sequence의 첫 원소부터 마지막 원소까지를 의미합니다.

 

for (n, c) in "Swift".enumerated() {
	print("\(n): '\(c)'")
}
// Prints "0: 'S'"
// Prints "1: 'w'"
// Prints "2: 'i'"
// Prints "3: 'f'"
// Prints "4: 't'"

 

대박..

 

예를들어

사과의 크기가 1~8까지 있습니다. list 배열에는 사과의 크기가 무작위로 들어가 있습니다.

list = [3,1,3,8,4]

사과의 가격은 무조건 index 0~4까지 5개 고정으로

costs = [5,7,8,2,3]

정해져 있습니다.

 

길다란 통이 있는데 그 통에는 크기가 4 이하인 사과만 담을 수 있습니다. 그래서 크기가 4이하인 사과를 전부 사려고 합니다. 이때의 가격 측정을 계산하는 문제가 있다고 한다고 가정하고 enumerated()를 사용해보려고 합니다.

 

결과는

var result = 0 에 추가할 것입니다.

1. 기본적인 for in 구문과 if 조건문 활용

for idx in 0..<list.count {
    if list[idx] <= 4 {
        result += costs[idx]
    }
}

2. for in 구문에서 enumerated() 활용

for (idx,apple) in list.enumerated() {
    if apple <= 4 {
        result += costs[idx]
    }
}

3. map에서 enumerated() 활용

_=list.enumerated().map{ (idx,apple) in
    if list[idx] <= 4 {
        result += costs[idx]
    }
}
print(result)

4. map과 filter + enumerated() 활용

_=list.enumerated().filter{$0.element<=4}.map{result+=costs[$0.offset]}
print(result)

여기서 $0은 (offset, element) 를 반환하고 element는 Sequence의 원소, offset는 해당 element의 index를 반합니다.

 

저는 이제 map과 enumerated()를 많이 사용할 것 같습니다!!