Arrays

jolly·2022년 11월 8일
0

Algorithm

목록 보기
2/3
post-thumbnail
post-custom-banner

What is Array?

Array is a collection of elements, all of the same type, that could be set and retrieved via continuous series of integers, or what are more commonly known as indices.

3 Characteristics of Array

  1. Arrays can contain anything.
  2. Arrays are of a fixed size.
  3. Arrays support random access.

Array's Time complexity

get/setInsertDeleteResize
Time ComplextityO(1)O(n)O(n)O(n)

※ 참고: https://developer.apple.com/documentation/swift/array

Q1. Rotate array to right N times.

https://app.codility.com/programmers/lessons/2-arrays/cyclic_rotation/

문제 설명
주어진 배열을 K번 회전시켜(= 마지막 요소를 맨 앞으로 이동시키는 것을 '회전'이라 함) 주석 처리와 같은 결과를 얻을 수 있게 하세요.
예를 들어, 주어진 배열이 [1, 2, 3, 4, 5]라면 1번 회전 후 얻을 수 있는 결과값은 [5, 1, 2, 3, 4]여야 합니다.

solution(A: [1, 2, 3, 4, 5], K: 1) // 5 1 2 3 4
solution(A: [1, 2, 3, 4, 5], K: 2) // 4 5 1 2 3
solution(A: [1, 2, 3, 4, 5], K: 3) // 3 4 5 1 2

접근 방식 - stack 사용

  1. 배열의 마지막 요소를 찾아 맨 앞에 삽입한다.
  2. 맨 마지막 요소를 pop하도록 한다.

코드

/*using stacks*/

func solution(A: [Int], K: Int) -> [Int] {
    guard !A.isEmpty else {return []} //주의❗️
    guard K > 0 else {return A} //주의❗️
    
    var rotateArray:[Int] = A
    
    for _ in 0 ..< K {
        rotateArray.insert(rotateArray.last!, at: 0) 
        rotateArray.popLast()
    }
    return rotateArray
}

Q2. [Leetcode 1694] Reformat Phone Number

문제
링크 : https://leetcode.com/problems/reformat-phone-number/

You are given a phone number as a string number. number consists of digits, spaces ' ', and/or dashes '-'.

You would like to reformat the phone number in a certain manner. Firstly, remove all spaces and dashes. Then, group the digits from left to right into blocks of length 3 until there are 4 or fewer digits. The final digits are then grouped as follows:

  • 2 digits: A single block of length 2.
  • 3 digits: A single block of length 3.
  • 4 digits: Two blocks of length 2 each.

The blocks are then joined by dashes. Notice that the reformatting process should never produce any blocks of length 1 and produce at most two blocks of length 2.

Return the phone number after formatting.

접근 방식

  1. 주어진 문자열에서 number가 아닌 문자를 걸러내기 (공백이나 -)
  2. 주어진 문자열이 4글자 이상인지 확인하기
  3. 4글자 초과라면
    1) 반복문을 통해 앞에서 3글자 단위로 끊어주고 그 뒤에 '-' 를 붙여주기
    2) 3글자를 해당 문자열에서 제거하기
  4. 4글자라면
    1) 4글자 남았다면 2글자 단위로 끊어 '-'로 연결하기
    2) 4글자가 아닌 그 이하라면 단순히 String Interpolation으로 문자들을 연결해 주기

코드

class Solution {
    func reformatNumber(_ number: String) -> String {
         var numbers = Substring(number.filter{$0.isNumber})
         var result = ""

         while numbers.count > 4 {
            result += "\(numbers.prefix(3))-"
            numbers = numbers.dropFirst(3)
        }
         return numbers.count == 4 ? 
         "\(result)\(numbers.prefix(2))-\(numbers.suffix(2))" 
         : "\(result)\(numbers)"
    }
}

Q3. Phone Number

문제
When someone searches their contacts based on a phone number, it's nice when a list
of contact pops up.

Write an algorithm that searches you contacts for phone number strings, and returns:

  • NO CONTACT if contact can't be found
  • A contact if a contact is found
  • The first alphabetized contact if there are multiple
A = ["pim", "pom"]             // Contacts (return one of these)
B = ["999999999", "777888999"] // Phone numbers for each contact A[i] = B[i]
P = "88999"                    // Search phrase - "pom" 출력

접근 방식

⭐️ Dictionary 활용하기
1. 주인이 이름인 A배열이 key이고, 전화번호인 B 배열이 value로 구성된 dictionary만들기(reason. 전화 번호의 주인의 이름과 전화 번호는 1대1 매칭되므로)
2. dictionary의 value가 P와 일치하는 딕셔너리 구하기
3. 개수에 따라 분기 처리하기

코드

public func solution(_ A : [String], _ B : [String], _ P : String) -> String {
    var dictArray: [String: String] = [:]
    for index in 0 ..< A.count {
        dictArray[A[index]] = B[index]
    }
    
    let matches = dictArray.filter{$0.value.contains(P)}
    

    if matches.count == 0 { //일치하는 게 하나도 없을 경우
        return "NO CONTACT"
    } else if matches.count == 1 { //1개만 일치할 경우
        return matches.first!.key
    }
    
    return matches.keys.sorted().first! //여러 개 일치 시 알파벳 순서로 정렬 후 출력 
}
post-custom-banner

0개의 댓글