[Swift] TwoSum

·2024년 11월 30일
0

SwiftAlgorithm

목록 보기
1/105

TwoSum문제 링크

Swift를 공부하면서 일단 Swift 간단한 문법만 훑은 다음에 SwiftUI 강의를 들었는데, 아직 좀 로직부분에서 문법이 모호한 것 같아서 일단 오늘부터 알고리즘을 매일 풀어야겠다고 생각을 했다.

저는 백준 입력받는게 좀 답답하다고 생각해서 Programmers나 Leetcode를 좋아하는 편이고, 어처피 영어에 좀 더 익숙해지면 좋을 것 같아서 LeetCode로 풀이했습니다

일단 문법이나 함수를 익숙해지는게 목적이라 EASY로 필터링한다음 1번문제(TwoSum)를 풀이했습니다.

문제

Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
You can return the answer in any order.

Example 1:
Input: nums = [2,7,11,15], target = 9
Output: [0,1]
Explanation: Because nums[0] + nums[1] == 9, we return [0, 1].

Example 2:
Input: nums = [3,2,4], target = 6
Output: [1,2]

배열이랑 타겟값이 주어지는데, 여기에서 target을 충족할 수 있는 숫자 쌍의 인덱스값을 출력해주면 된다고한다.

일단 생각나는대로 JS에서 하던 것 처럼
for문 두개 돌리면서 풀이해봤다.

class Solution {
    func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
        var answer :[Int] = []
        for i in 0..<nums.count-1 {
            for j in i+1..<nums.count{
                if(nums[i] + nums[j] == target){
                    answer = [i,j]
                }
            }
        }
    return answer
    }
}
  1. Swift에서는 원소값이 .length 대신에 .count 인 점
  2. for문의 범위 설정해줄때 ... 혹은 ..<으로 미만 처리를 해줄 수 있다는 점
    이를 고려해서 쉬운문제다 보니까 쉽게 풀 수는 있었는데,
    algorithm analyze

이렇게 볼 수 있듯이, 내 풀이가 좀 효율적이지 않다고 찍혀서 나왔다.
대다수가 풀이한 효율적인 풀이는
1. for문을 한번 돌려주면서
2. target에서 현재 포인팅하고있는 값을 빼준 것을 이제 리스트에서 찾고, 없으면 이를 등록한다.

이렇게 풀이를 해주고 있었다. 좀 더 분석해보자면

class Solution {
    func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
        var elementRegist = [Int: Int]() // 없으면 등록하는 딕셔너리
        for (index, value) in nums.enumerated() {
            print(index, "INDEX")
            print("VALUE \(value)")
            let supply = target - value
            if let answer = elementRegist[supply] { // 찾아지면은
                return [index, answer]
            }
            elementRegist[value] = index
            print("ELEMENTOS \(elementRegist)")
        }
        return []
    }
}

배운점

1.js에서 forEach처럼 배열.enumerated()를 해주면 이제 index,value로 반복문을 돌릴 수 있구나 !
2. if let으로 이제 elementRegist[supply] , 즉 현재 찾고 있는 친구(타겟에서 현재 포인팅 값 빼준 것)가 새로만든 딕셔너리에 없다면 이제 if let 통과하고 아래부분 등록을 하게 될 것이다. 물론 if else가 편하게 느껴질 수도 있는데, swift에선 이런경우 없을 수도 있는 Optional한 값에 대해서는 if else를 쓰면 변수뒤에! 붙여주면서 nil 값인지 판단해주는 불필요한 코드가 늘어나기 때문에 if let , guard let 쓰는게 좀 권장되는 것 같다.

if-else코드

class Solution {
    func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
        var elementRegist = [Int: Int]() // 없으면 등록하는 딕셔너리
        for (index, value) in nums.enumerated() {
            let supply = target - value
            if elementRegist[supply] != nil { // supply에 해당하는 값이 존재하면
                return [index, elementRegist[supply]!]
            } else {
                elementRegist[value] = index
            }
            print("ELEMENTOS \(elementRegist)")
        }
        return []
    }
}
profile
기억보단 기록을

0개의 댓글