문제 설명

정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.

  1. n행 n열 크기의 비어있는 2차원 배열을 만듭니다.
  2. i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다.
    • 1행 1열부터 i행 i열까지의 영역 내의 모든 빈 칸을 숫자 i로 채웁니다.
  3. 1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.
  4. 새로운 1차원 배열을 arr이라 할 때, arr[left], arr[left+1], ..., arr[right]만 남기고 나머지는 지웁니다.

정수 n, left, right가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.


제한사항
  • 1 ≤ n ≤ 10^7
  • 0 ≤ left  right < n^2
  • right - left < 10^5

내가 푼 풀이

처음에는 그냥 2차원 배열을 구해서 1차원배열로 만들고 그에 해당하는 인덱스의 범위를 출력하려고 했는데

주어지는 n의 최대크기가 10^7 이라서, 2중 for문을 이용하면 무조건 시간초과가 뜨겠다 싶어서 해당하는 인덱스의 범위만 구하고

해당 배열이 만들어지는 규칙을 적용해서 정답을 출력하기로 했다.

이 문제에 적용한 배열이 만들어지는 규칙은 i행 1열부터 i열까지의 원소는 전부 i, i행 i+1열부터는 i+1, i+2 ... 이다.

ex) n = 3 일때 3x3 행렬 3행 1열 부터 3열까지는 전부 3이다.

ex) n = 5 일때 5x5 행렬 3행 1열 부터 3열까지는 전부 3이다. 3행 4열은 3+1 = 4, 3행 5열은 3+2 = 5 이다.

 

구하고자하는 범위 [left...right] 의 배열

전부 n으로 나눈 나머지 그 행의 순서가 나온다. 

전부 n으로 나눈 몫으로 바꾸면 그 행의 번호가 나온다. 

해당하는 위치의 순서가 행의 번호 보다 작거나 같으면 그 위치의 원소는 행의번호

해당하는 위치의 순서가 행의 번호 보다 크다면 그 위치의 원소는 행의번호 + (행의순서 - 행의번호 )

배열의 원소는 인덱스로 구성되어있으니 출력할때 +1을 해준다.

글로만 봐서는 헷갈리니까 예제문제로 예시를 들어본다.

 

ex) n = 3 , 3x3 행렬, left = 2, right = 5 

[[1,2,3],

 [2,2,3],

 [3,3,3]]

  • 구하고자 하는 범위의 인덱스를 배열로 만든다. :  [2,3,4,5]
  • 인덱스 배열을 3로 나눈 나머지 :  [2, 0, 1, 2] ( 행의 순서)
  • 인덱스 배열을 2으로 나눈 몫 : [0, 1, 1, 1] (행의 번호)

인덱스배열 첫번째 2

행의 번호: 0 ,행의 순서: 2

행의 순서가 행의번호보다 크다. 결과는 행의번호 + 행의순서 - 행의번호 = 2 

위에 숫자는 전부 배열의 인덱스 이므로 +1 해서 출력한다 -> 3

 

인덱스배열 두번째 3

행의번호: 1, 행의순서: 0

행의번호가 더 크다. 결과는 행의번호

숫자는 배열의 인덱스이므로 +1을 해서 출력한다 -> 2

 

인덱스배열 세번째 4

행의번호: 1, 행의순서: 1

행의번호와 행의순서가 같다. 결과는 행의번호

숫자는 배열의 인덱스이므로 +1을 해서 출력한다 -> 2

 

인덱스배열 세번째 5

행의번호: 1, 행의순서: 2

행의순서가 행의번호 보다 크다. 결과는 행의번호 + 행의순서 - 행의번호 = 2

숫자는 배열의 인덱스이므로 +1을 해서 출력한다 -> 3

 

이런 규칙을 적용하여 풀었다.

 

import Foundation

func solution(_ n:Int, _ left:Int64, _ right:Int64) -> [Int] {
    var arr = Array(left...right)
    var rows: [Int64] = arr.map{ $0 % Int64(n)}
    var cols: [Int64] = arr.map{ $0 / Int64(n)}
    var result = [Int]()
    
    for i in 0..<rows.count {
        var num = cols[i] + 1
        if rows[i] <= cols[i] {
            result.append(Int(num))
        }  else {
            result.append(Int(num + (rows[i] - cols[i])))
        }
    }
    return result
}

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

연속 부분 수열 합의 개수 Swift  (0) 2023.04.12
위장 Swift  (0) 2023.04.12
튜플 Swift  (0) 2023.04.12
[1차] 캐시 Swift  (0) 2023.04.12
괄호 회전하기 Swift  (0) 2023.04.12

문제 설명

셀수있는 수량의 순서있는 열거 또는 어떤 순서를 따르는 요소들의 모음을 튜플(tuple)이라고 합니다. n개의 요소를 가진 튜플을 n-튜플(n-tuple)이라고 하며, 다음과 같이 표현할 수 있습니다.

  • (a1, a2, a3, ..., an)

튜플은 다음과 같은 성질을 가지고 있습니다.

  1. 중복된 원소가 있을 수 있습니다. ex : (2, 3, 1, 2)
  2. 원소에 정해진 순서가 있으며, 원소의 순서가 다르면 서로 다른 튜플입니다. ex : (1, 2, 3) ≠ (1, 3, 2)
  3. 튜플의 원소 개수는 유한합니다.

원소의 개수가 n개이고, 중복되는 원소가 없는 튜플 (a1, a2, a3, ..., an)이 주어질 때(단, a1, a2, ..., an은 자연수), 이는 다음과 같이 집합 기호 '{', '}'를 이용해 표현할 수 있습니다.

  • {{a1}, {a1, a2}, {a1, a2, a3}, {a1, a2, a3, a4}, ... {a1, a2, a3, a4, ..., an}}

예를 들어 튜플이 (2, 1, 3, 4)인 경우 이는

  • {{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}

와 같이 표현할 수 있습니다. 이때, 집합은 원소의 순서가 바뀌어도 상관없으므로

  • {{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}
  • {{2, 1, 3, 4}, {2}, {2, 1, 3}, {2, 1}}
  • {{1, 2, 3}, {2, 1}, {1, 2, 4, 3}, {2}}

는 모두 같은 튜플 (2, 1, 3, 4)를 나타냅니다.

특정 튜플을 표현하는 집합이 담긴 문자열 s가 매개변수로 주어질 때, s가 표현하는 튜플을 배열에 담아 return 하도록 solution 함수를 완성해주세요.

[제한사항]

  • s의 길이는 5 이상 1,000,000 이하입니다.
  • s는 숫자와 '{', '}', ',' 로만 이루어져 있습니다.
  • 숫자가 0으로 시작하는 경우는 없습니다.
  • s는 항상 중복되는 원소가 없는 튜플을 올바르게 표현하고 있습니다.
  • s가 표현하는 튜플의 원소는 1 이상 100,000 이하인 자연수입니다.
  • return 하는 배열의 길이가 1 이상 500 이하인 경우만 입력으로 주어집니다.

내가 푼 풀이

주어진 문자열을 2차원 배열로 만들고, 배열의 크기순으로 정렬한 다음 중복되는 값들을 소거하고 출력한다.

 

replacingOccurrences

split

subtracting

import Foundation

func solution(_ s:String) -> [Int] {
    var arr = s.split(separator: "{").map{String($0)}
    var nums = [[Int]]()
    var result = [Int]()
    arr = arr.map{ $0.replacingOccurrences(of: "}", with: "")}.sorted{$0.count < $1.count}
    for i in 0..<arr.count {
        nums.append(arr[i].split(separator: ",").map{Int(String($0))! })
    }
    result.append(nums[0][0])
    for i in 1..<nums.count {
        var set1 = Set(nums[i])
        var set2 = Set(nums[i-1])
        result += Array(set1.subtracting(set2))
        
    }
    return result
}

 

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

위장 Swift  (0) 2023.04.12
n^2 배열 자르기 Swift  (0) 2023.04.12
[1차] 캐시 Swift  (0) 2023.04.12
괄호 회전하기 Swift  (0) 2023.04.12
귤 고르기 Swift  (0) 2023.04.12

캐시

지도개발팀에서 근무하는 제이지는 지도에서 도시 이름을 검색하면 해당 도시와 관련된 맛집 게시물들을 데이터베이스에서 읽어 보여주는 서비스를 개발하고 있다.
이 프로그램의 테스팅 업무를 담당하고 있는 어피치는 서비스를 오픈하기 전 각 로직에 대한 성능 측정을 수행하였는데, 제이지가 작성한 부분 중 데이터베이스에서 게시물을 가져오는 부분의 실행시간이 너무 오래 걸린다는 것을 알게 되었다.
어피치는 제이지에게 해당 로직을 개선하라고 닦달하기 시작하였고, 제이지는 DB 캐시를 적용하여 성능 개선을 시도하고 있지만 캐시 크기를 얼마로 해야 효율적인지 몰라 난감한 상황이다.

어피치에게 시달리는 제이지를 도와, DB 캐시를 적용할 때 캐시 크기에 따른 실행시간 측정 프로그램을 작성하시오.

입력 형식

  • 캐시 크기(cacheSize)와 도시이름 배열(cities)을 입력받는다.
  • cacheSize는 정수이며, 범위는 0 ≦ cacheSize ≦ 30 이다.
  • cities는 도시 이름으로 이뤄진 문자열 배열로, 최대 도시 수는 100,000개이다.
  • 각 도시 이름은 공백, 숫자, 특수문자 등이 없는 영문자로 구성되며, 대소문자 구분을 하지 않는다. 도시 이름은 최대 20자로 이루어져 있다.

출력 형식

  • 입력된 도시이름 배열을 순서대로 처리할 때, "총 실행시간"을 출력한다.

조건

  • 캐시 교체 알고리즘은 LRU(Least Recently Used)를 사용한다.
  • cache hit일 경우 실행시간은 1이다.
  • cache miss일 경우 실행시간은 5이다.

내가 푼 풀이

LRU 알고리즘을 모르고 가장 최근에 사용된 캐시가 있다면 hit 없으면 miss 인 줄 알았다.

그래서 캐시의 크기만큼 배열을 만들어서 주어진 도시들을 순회하면서 밀어내기식으로 검사했는데 틀렸다

이 문제의 핵심은 LRU 알고리즘을 알고 있는지 이다.

 

LRU : Least Recently Used 로 가장 오랫동안 참조하지 않은 원소를 교체하는 방식이다.

 

여기서 문제풀이의 핵심은 검사배열에 없다면 추가해주고 있으면 순서를 앞으로 당겨줘야한다.

배열에 추가하기 쉽게 배열의 마지막인덱스가 가장 최근에 추가된 원소로 한다.

 

배열안에 존재할때

  • array.contains(city)  = true  -> array.remove(at: city.index) , array.append(city)

배열안에 존재하지 않을때

  • array.contains(city)  = false -> array.append(city)
  • array.count > cache.count   -> array.removeFirst() , array.append(city)

 

func solution(_ cacheSize:Int, _ cities:[String]) -> Int {
    var cache = [String]()
    var result = 0
    
    
    for i in 0..<cities.count {
        var city = cities[i].uppercased()
        if !cache.contains(city) {
            result += 5
            cache.append(city)
            if cache.count > cacheSize {
                cache.removeFirst()
            }
        } else {
            for j in 0..<cache.count {
                if cache[j] == city {
                    cache.remove(at: j)
                    cache.append(city)
                    break
                }
            }
            result += 1
        }
    }
    return result
}

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

n^2 배열 자르기 Swift  (0) 2023.04.12
튜플 Swift  (0) 2023.04.12
괄호 회전하기 Swift  (0) 2023.04.12
귤 고르기 Swift  (0) 2023.04.12
멀리 뛰기 Swift  (0) 2023.04.11

문제 설명

다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.

  • (), [], {} 는 모두 올바른 괄호 문자열입니다.
  • 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
  • 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {}  ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.

대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.


제한사항
  • s의 길이는 1 이상 1,000 이하입니다.

내가 푼 풀이

괄호의 규칙에 따르면

  • 괄호가 열리자마자 바로 닫히면 올바른 문자열
  • 괄호가 괄호안에 품어있다면 올바른 문자열
  • 올바른 괄호 문자열이 연속된다면 합쳐도 올바른 문자열

올바른 문자열이 있다면 올바른 문자열이 존재할때 까지 계속 지워서 문자열의 길이가 0이면 올바른 문자열 이다.

이렇게 짠다면 위 세가지의 규칙에 맞기도하고, Swift로 문자열을 다루기엔 머리가 아팠다. 단순하게 생각했다.

하지만 조건이 떠오르지 않아서, 문자열을 순회하면서 스택에 넣어서 첫번째 규칙에 해당되면 바로 지우는 방식으로 풀었다.

이 문제와 같이 조건에 해당하면, 소거해나가는 형식은 앞으로 stack을 이용해야겠다.

 

더 단순하게 올바른 문자열이 존재하지 않을때까지 지우는 방법은

문자열s를  s.contains("()")  || s.contains("[]")  || s.contains("{}") 조건문에 통과하게 만들고

s.replacingOccurrences()로 세가지 괄호를 다 지우는 것이다

s 문자열이 남아있다면 올바르지 않은 문자열, 남아있지 않다면 올바른 문자열

 

import Foundation

func solution(_ s:String) -> Int {
    var result = 0
    var check = ["()", "[]", "{}"]
    var string = s
    for i in 0..<string.count {
        var stack = [String]()
        var arr = string.map{String($0)}
        for j in 0..<arr.count {
            stack.append(arr[j])
            if stack.count < 2 {
                continue
            }
            
            while stack.count > 1 {
                var str = "\(stack[stack.endIndex-2])" + "\(stack[stack.endIndex-1])"
                if check.contains(str) {
                    stack.popLast()
                    stack.popLast()
                } else {
                    break
                }
            }
            
        }
        if stack.count < 1 {
            result += 1
        }
        var first = string.removeFirst()
        string = "\(string)" + "\(first)"
        
    }
    return result
}

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

튜플 Swift  (0) 2023.04.12
[1차] 캐시 Swift  (0) 2023.04.12
귤 고르기 Swift  (0) 2023.04.12
멀리 뛰기 Swift  (0) 2023.04.11
예상 대진표 Swift  (0) 2023.04.11

문제 설명

경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 'k'개를 골라 상자 하나에 담아 판매하려고 합니다. 그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한 경화는 귤을 크기별로 분류했을 때 서로 다른 종류의 수를 최소화하고 싶습니다.

예를 들어, 경화가 수확한 귤 8개의 크기가 [1, 3, 2, 5, 4, 5, 2, 3] 이라고 합시다. 경화가 귤 6개를 판매하고 싶다면, 크기가 1, 4인 귤을 제외한 여섯 개의 귤을 상자에 담으면, 귤의 크기의 종류가 2, 3, 5로 총 3가지가 되며 이때가 서로 다른 종류가 최소일 때입니다.

경화가 한 상자에 담으려는 귤의 개수 k와 귤의 크기를 담은 배열 tangerine이 매개변수로 주어집니다. 경화가 귤 k개를 고를 때 크기가 서로 다른 종류의 수의 최솟값을 return 하도록 solution 함수를 작성해주세요.


제한사항
  • 1 ≤ k  tangerine의 길이 ≤ 100,000
  • 1 ≤ tangerine의 원소 ≤ 10,000,000

내가 푼 풀이

귤의 크기별 갯수를 구하고, 갯수가 많은 귤부터 포장에 들어간다.

귤 종류가 바뀌면 result += 1  , result 출력

 

import Foundation

func solution(_ k:Int, _ tangerine:[Int]) -> Int {
    var dict = [Int: Int]()
    var size = Set(tangerine).sorted{ $0 < $1 }
    var result = 0
    var num = k

    for i in tangerine {
        if dict[i] == nil {
            dict[i] = 1
        } else {
            dict[i]! += 1
        }
    }
    
    var sortedDict = dict.sorted{ $0.value > $1.value}
    for i in sortedDict {
        result += 1
        num -= i.value
        if num <= 0 {
            break
        }
    }
    return result
}

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

[1차] 캐시 Swift  (0) 2023.04.12
괄호 회전하기 Swift  (0) 2023.04.12
멀리 뛰기 Swift  (0) 2023.04.11
예상 대진표 Swift  (0) 2023.04.11
짝지어 제거하기 Swift  (0) 2023.04.11

문제 설명

효진이는 멀리 뛰기를 연습하고 있습니다. 효진이는 한번에 1칸, 또는 2칸을 뛸 수 있습니다. 칸이 총 4개 있을 때, 효진이는
(1칸, 1칸, 1칸, 1칸)
(1칸, 2칸, 1칸)
(1칸, 1칸, 2칸)
(2칸, 1칸, 1칸)
(2칸, 2칸)
의 5가지 방법으로 맨 끝 칸에 도달할 수 있습니다. 멀리뛰기에 사용될 칸의 수 n이 주어질 때, 효진이가 끝에 도달하는 방법이 몇 가지인지 알아내, 여기에 1234567를 나눈 나머지를 리턴하는 함수, solution을 완성하세요. 예를 들어 4가 입력된다면, 5를 return하면 됩니다.

제한 사항
  • n은 1 이상, 2000 이하인 정수입니다.

내가 푼 풀이

처음에는 n은 1칸,2칸의 갯수 합, r은 2칸의 갯수로 nCr 조합의 총합을 구해서 1234567 로 나눈 값을 출력하려고 했다.

nCr = nPr / r! = n! / r!(n-r)! 이다. 이 방법을 이용하려는데 n의 최대값은 2000이다

위 공식을 이용하는데 2000!은 어마어마한 크기이고, Int로 담지 못한다.

 

다른방법은 규칙을 찾는것인데, 이 문제는 피보나치 수의 점화식을 적용할 수 있다.

n[1]= 1, n[2]= 2, n[3] = 1+ 2 = 3, n[4] = 2 + 3 = 5 ..... n[i] = n[i-1] + n[i-2]

1<= n <= 2000 인 n 역시 피보나치 수를 적용해 n번째 수는 매우매우 큰 수이다.

재귀적으로 변수 하나에 더해가는 방법보다

n크기만큼 배열을 만들어서 더한 수를 1234567로 나눈 값을 배열에 적용해서 접근하기로 한다.

피보나치 수의 성질을 이용하려면 먼저 n[1]= 1, n[2]= 2 를 넣고 3부터 적용한다.

 

func solution(_ n:Int) -> Int {
    var num = n
    var arr = Array(repeating: 0, count: n + 1)
    if n == 1 {
        return 1
    }
    arr[0] = 1
    arr[1] = 2
    
    for i in 2..<num {
        arr[i] = (arr[i-1] + arr[i-2]) % 1234567
    }
    return arr[num - 1]
}

 

 

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

괄호 회전하기 Swift  (0) 2023.04.12
귤 고르기 Swift  (0) 2023.04.12
예상 대진표 Swift  (0) 2023.04.11
짝지어 제거하기 Swift  (0) 2023.04.11
최소직사각형 Swift  (0) 2023.04.10

문제 설명

△△ 게임대회가 개최되었습니다. 이 대회는 N명이 참가하고, 토너먼트 형식으로 진행됩니다. N명의 참가자는 각각 1부터 N번을 차례대로 배정받습니다. 그리고, 1번↔2번, 3번↔4번, ... , N-1번↔N번의 참가자끼리 게임을 진행합니다. 각 게임에서 이긴 사람은 다음 라운드에 진출할 수 있습니다. 이때, 다음 라운드에 진출할 참가자의 번호는 다시 1번부터 N/2번을 차례대로 배정받습니다. 만약 1번↔2번 끼리 겨루는 게임에서 2번이 승리했다면 다음 라운드에서 1번을 부여받고, 3번↔4번에서 겨루는 게임에서 3번이 승리했다면 다음 라운드에서 2번을 부여받게 됩니다. 게임은 최종 한 명이 남을 때까지 진행됩니다.

이때, 처음 라운드에서 A번을 가진 참가자는 경쟁자로 생각하는 B번 참가자와 몇 번째 라운드에서 만나는지 궁금해졌습니다. 게임 참가자 수 N, 참가자 번호 A, 경쟁자 번호 B가 함수 solution의 매개변수로 주어질 때, 처음 라운드에서 A번을 가진 참가자는 경쟁자로 생각하는 B번 참가자와 몇 번째 라운드에서 만나는지 return 하는 solution 함수를 완성해 주세요. 단, A번 참가자와 B번 참가자는 서로 붙게 되기 전까지 항상 이긴다고 가정합니다.

제한사항
  • N : 21 이상 220 이하인 자연수 (2의 지수 승으로 주어지므로 부전승은 발생하지 않습니다.)
  • A, B : N 이하인 자연수 (단, A ≠ B 입니다.)

내가 푼 풀이

참가자 번호 A,B 

N의 지수를 구하고 지수만큼 반복한다.

지수만큼 반복할 때, N을 2로 나눠서 참가자 A,B가 어디 범위에 있는지 조사한다.

N을 2로 나눴을때 양쪽에 존재하는경우, 현재 지수번째 라운드에서 만나게 된다.'

N을 2로 나눴을때 두 참가자가 나눈 값보다 위에 있을때 참가자의 번호에서 나눈값을 빼서 범위 조사에 용이하게 한다.

 

ex) N = 8, A= 4, B= 7, n의 지수 count: 3

count = 3 일때)

  • N / 2 = 4 , 4 를 기준으로 A는 4보다 같거나 작고, B는 4보다 크다.
  • N/ 2 기준으로 양쪽에 참가자가 있으므로 count = 3 인 3번째 라운드에서 만난다.

 

ex) N = 8, A= 1, B= 2, n의 지수 count: 3

count = 3 일때)

  • N / 2 = 4 , 4 를 기준으로 A와 B 둘다 4보다 작다.
  • N / 2 = 4 를 기준으로 양쪽에 존재하지 않으므로 count - 1

count = 2 일때)

  • N / 2 = 2 , 2 를 기준으로 A와 B 둘다 2보다 작거나 같다.
  • N / 2 = 2 를 기준으로 양쪽에 존재하지 않으므로 count - 1

count = 1 일때)

  • N / 2 = 1 , 1 를 기준으로 A = 1, B = 2 이므로 A는 1보다 작거나같고, B는 1보다 크다.
  • N / 2 = 1 를 기준으로 양쪽에 존재하므로 count  = 1 인 1번째 라운드에서 만난다.

 

만약 A와 B 둘다 n/2 보다 큰경우, N/2 만큼 빼서 대진표의 왼쪽편으로 이동하게 한다.

결국 A와 B가 몇번째 라운드에서 만나는지가 중요하기 때문에, n/2 만큼 빼서 범위계산하기 더 편하게 한다.

 

import Foundation

func solution(_ n:Int, _ a:Int, _ b:Int) -> Int
{
    var num = n
    var numA = a
    var numB = b
    var count = 0
    var result = 0
    while num > 0 {
        num = num / 2
        count += 1
    }
    
    num = n
    
    while count > 0 {
        count -= 1
        var arr = [Int]()
        num = num / 2
        arr.append(numA)
        arr.append(numB)
        
        if arr.filter{ $0 <= num }.count == 1 {
            result = count
            break
        }else if arr.filter{ $0 > num}.count == 2 {
            numA = numA - num
            numB = numB - num
        }
        
    }

    return result
}

 

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

귤 고르기 Swift  (0) 2023.04.12
멀리 뛰기 Swift  (0) 2023.04.11
짝지어 제거하기 Swift  (0) 2023.04.11
최소직사각형 Swift  (0) 2023.04.10
없는 숫자 더하기 Swift  (0) 2023.04.10

문제 설명

짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙입니다. 이 과정을 반복해서 문자열을 모두 제거한다면 짝지어 제거하기가 종료됩니다. 문자열 S가 주어졌을 때, 짝지어 제거하기를 성공적으로 수행할 수 있는지 반환하는 함수를 완성해 주세요. 성공적으로 수행할 수 있으면 1을, 아닐 경우 0을 리턴해주면 됩니다.

예를 들어, 문자열 S = baabaa 라면

b aa baa → bb aa → aa 

의 순서로 문자열을 모두 제거할 수 있으므로 1을 반환합니다.

제한사항
  • 문자열의 길이 : 1,000,000이하의 자연수
  • 문자열은 모두 소문자로 이루어져 있습니다.

내가 푼 풀이

문자열을 순회하면서 stack 배열에 넣는다.

배열의 크기가 2 이상이면 순회할때마다 마지막 index의 값과 그 전의 값을 비교해서 같으면 제거

stack에 원소가 남아있으면 0, 없으면 1

 

import Foundation

func solution(_ s:String) -> Int{
    var stack = [String]()
    for i in s {
        var str = String(i)
        stack.append(str)
        if stack.count >= 2 {
            if stack[stack.endIndex - 1] == stack[stack.endIndex - 2] {
                stack.popLast()
                stack.popLast()
            }
        }
    }
    if stack.count == 0 {
        return 1
    } else {
        return 0
    }
}

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

멀리 뛰기 Swift  (0) 2023.04.11
예상 대진표 Swift  (0) 2023.04.11
최소직사각형 Swift  (0) 2023.04.10
없는 숫자 더하기 Swift  (0) 2023.04.10
나머지가 1이 되는 수 찾기 Swift  (0) 2023.04.10

+ Recent posts