본문 바로가기
TIL

[240329] index(_:offsetBy:)/contains()/isSubset(of:)/이중배열 enumerated()

by 줍 2024. 3. 29.

1. 어떤 배열에서 특정 조건을 만족하는 요소들만 추출해 새 배열을 생성할때는 filter 함수 활용하기.

배열의 특정 인덱스에서 특정 거리만큼 떨어진 인덱스를 구할때는 index(_:offsetBy:)를 쓸 수 있다.

배열의 크기를 초과하면 다시 첫 인덱스로 돌아오는 패턴인 경우 배열의 크기로 나눈 나머지값을 인덱스로 활용하자 %%%

func solution(_ s:String, _ skip:String, _ index:Int) -> String {
    var skip = skip.map { String($0) }
    var arr = "abcdefghijklmnopqrstuvwxyz".map { String($0) }.filter { !skip.contains($0) }
    var answer = ""

    for i in s {
        answer += arr[arr.index(arr.firstIndex(of: String(i))!, offsetBy: index) % arr.count]
    }
    return answer
}

 

 

2. 대충 만든 자판 문제

일단 target을 이루는 알파벳이 모두 keymap에 존재해야하기 때문에, keymap의 중첩배열을 없애고 contains 함수로 확인을 해줬는데 계속 결과값이 이상했다. 배열은 순서를 갖는 시퀀스이기때문에 순서까지 맞아야 true를 반환한다. 그래서 집합으로 바꿔서 contains를 써봤는데 여전히 결과는 같았다,,contains 함수 자체가 순서까지 맞아야 true를 반환하는 것 같다. 그래서 isSubset 함수를 써서 부분집합인지 확인해주는 방법으로 해결했다.

func solution(_ keymap:[String], _ targets:[String]) -> [Int] {
    var keymap = keymap.map { $0.map { String($0) } }
    var targets = targets.map { $0.map { String($0) } }
    var answer: [Int] = []
    
    for target in targets {
        if !Set(target).isSubset(of: Set(keymap.flatMap { $0 })) {
            answer.append(-1)
            continue
        }
        
        var sum = 0
        for t in target {
            var a = keymap.sorted { $0.firstIndex(of: t) ?? 100 < $1.firstIndex(of: t) ?? 100 }.first!
            sum += a.firstIndex(of: t)! + 1
        }
        answer.append(sum)
    }
    return answer
}

 

 

3. 바탕화면 정리 문제

이 풀이 넘 맘에 든다! (다른 사람 풀이) min, max 갱신 + 이중배열에 enumerated() 써서 인덱스값 좌표로 쓰는거 ..깔꿈쓰

func solution(_ wallpaper:[String]) -> [Int] {
   
    var (lux, luy) = (50, 50)
    var (rdx, rdy) = (0, 0)

    for (i, str) in wallpaper.enumerated() {
        for (j, file) in str.enumerated() {
            if file == "#" {
                lux = min(lux, i)
                luy = min(luy, j)
                rdx = max(rdx, i)
                rdy = max(rdy, j)
            }
        }
    }
    return [lux, luy, rdx + 1, rdy + 1]
}