24일날 시작한 기초 트레이닝이 27일까지 이어지고 day7,8의 란이 열렸다

1. 수열과 구간 쿼리 4

s,e,k 값이 주어질때 s~e 구간의 순회 문제.

  var copyArr = arr
  for query in queries {
    let s = query[0], e = query[1], k = query[2]
    for i in s...e {
      if i % k != 0 { continue }
      copyArr[i] += 1
    }
  }
  return copyArr

 

2. 배열 만들기 2

숫자 "0"과 "5"로만 이루어진 모든 정수를 오름차순으로 저장한 배열을 return

  let pattern: String = "^[0,5]*$"

  var result: [Int] = []
  for i in l ... r {
    let str: String = .init(i)
    if (str.range(of: pattern, options: .regularExpression) != nil) {
      result.append(i)
    }
  }
  return result.isEmpty ? [-1] : result

처음엔 5와 0으로된 이진법으로 계산해서 하려고했으나 잘 안풀려서 결국 그냥 모든 배열에서 필터하는 방법으로 변경

작성하고나니 필터함수로 썻으면 더 짧게 했을거같다

 

3. 배열 만들기 4

배열을 순회해서 필터링하기

var stk: [Int] = []
  var i: Int = 0
  
  while i < arr.count {
    if stk.isEmpty {
      stk.append(arr[i])
      i += 1
    } else if stk.last! < arr[i] {
      stk.append(arr[i])
      i += 1
    } else if stk.last! >= arr[i] {
      _ = stk.popLast()
    }
  }
  return stk

문제 지문 그대로 코드로 옴겼더니 좀 길어졌다 조건문 위 두개를 하나로 합칠수 있지않았을까

 

4. 주사위 게임 3

주사위 네개의 값이 주어졌을때 각각 계산하는게 달라지는 문제.

  var dice: [Int : Int] = [:]
  [a,b,c,d].forEach { num in
    if dice[num] == nil {
      dice[num] = 1
    } else {
      dice[num]! += 1
    }
  }
  
  if dice.count == 1 {
    return 1111 * a
  }
  
  if dice.count == 2 {
    var max: Int = 0, p: Int = 0, q: Int = 0
    
    for (key, value) in dice {
      if max < value {
        max = value
        p = key
      }
    }
    q = dice.keys.filter { key in
      key != p
    }.first!
    
    // 주사위가 3개가같을때와 2개가 같을때
    return max == 3 ? (10 * p + q) * (10 * p + q) : (p + q) * abs(p-q)
  }
  
  if dice.count == 3 {
    // 주사위 한쌍이 같고 나머지 달라
    var max: Int = 0, p: Int = 0
    
    for (key, value) in dice {
      if max < value {
        max = value
        p = key
      }
    }
    
    let res: [Int] =  dice.keys.filter { key in
      key != p
    }.map { $0 }
    
    guard res.count == 2 else { return -1 }
    return res[0] * res[1]
  }
  
  return min(a, b, c, d)

문제 순서대로 쭉 적어서 겹치는 부분이 좀 보인다. 반은 줄일 수 있을거같다 하지만 귀찮다 점수는 받았으니 괜찮겠지

 

5. 문자열 여러 번 뒤집기

원본 문자열과 문자열 인덱스 범위가 배열로 주어지고 각 인덱스 범위를 뒤집어서 출력하는 문제

  func reverse(_ str: String, _ s: Int, _ e: Int) -> String {
    var copy_arr = Array(str).map { String($0) }
    let target = copy_arr[s...e].map { $0 }
    for i in s...e {
      copy_arr[i] = target[e - i]
    }
    return copy_arr.joined()
  }
  
  var copy_str: String = my_string
  
  for q in queries {
    copy_str = reverse(copy_str, q[0], q[1])
  }
  return copy_str

이전에 비슷한 문제가 있어서 해당 코드를 reverse로 함수화해서 그대로 사용.

답을 내고 보니 replaceSubrange 라는걸 사용해서 문자열 수정해본다는게 잊고있었다.

 

아무튼 이렇게 8일치까지 끝

9일치는 이미 달성되어있고 10일치는 한문제니 다음 포스트는 한문제가 될것같다. 오늘 더이상 문제를 안푼다면 말이다

+ Recent posts