한 이틀 정도만 꽤나 열심히 진행했고 그후로는 그냥 한두문제씩 풀고있는데 끝이보이는것도 신기하다

1. 전국대회선발고사

모든 사람의 등수와 이 사람들의 참가 가능여부를 담은 배열 두개를 넣어 마지막 계산식을 반환하는문제

  var trueIndex: [Int] = []
  for( i,b) in attendance.enumerated() {
    if !b { continue }
    trueIndex.append(i)
  }
  var playerRanks: [Int] = []
  for i in trueIndex {
    playerRanks.append(rank[i])
  }
  playerRanks.sort()
  let top3PlayerRanks = playerRanks[0..<3]
  var top3PlayerIndex: [Int] = []
  for tRank in top3PlayerRanks {
    let index = rank.firstIndex { rank in
      rank == tRank
    }
    guard index != nil else {
      return -1
    }
    top3PlayerIndex.append(index!)
  }
  guard top3PlayerIndex.count == 3 else { return -2 }
  let a = top3PlayerIndex[0], b = top3PlayerIndex[1], c = top3PlayerIndex[2]
  return 10000 * a + 100 * b + c

문제를 읽으면서 순서대로 코드로 옴겼더니 코드가 엄청 길어졌다.

일단 답은 맞아서 타인의 답을 볼수 있게 되었는데 zip을 이용해 원본인덱스와 등수를 저장한후 정렬,필터할 생각은 못했구나

엄청 짧게 가능한거 보면 대단들하다

 

2. 두 수의 합

대학시절 1학년때 가산기 만들던거를 코드로 만들어봐라 하는 문제이다

  /**
   어떻게 할까.
   그냥 더해버리면 Int최대값을 넘어버린다, uint로 하면되지 않을까 했지만 안되고, longlongint로 하면되지않나? uint64도 넘어버리나보다.
   문자열을 잘라서 일부분씩 더하고 넘어가는 자리만 따로 구해서 더하는 방식으로 가야겠다.
   0. 네자리수의 문자열을 int형으로 변환후 더하고 자리수가 넘어가는 수와 분리해 넘어가는수, 합쳐진 네자리숫자를 반환하는 함수를 만든다.
   1. 문자열의 뒤 네자리씩 자른 배열로만든다
   2. 0에서 만든 함수를 돌려서 계산
   3. 각 자리수 위치에 맞게 정렬해서 반환
   - 한자리로 만들어 테스트해볼까?
   */
//  return "\(UInt64(a)! + UInt64(b)!)"
  // return (오버, 더해진값)
  enum cError: Error {
    case outOverRange
  }
  // 한자리 덧셈
  func add(over: Int, a: Int, b: Int) throws -> (Int, String) {
    if a > 9 || b > 9 || over > 9 {
      throw cError.outOverRange
    }
    
    let total: Int = over + a + b
    if total < 10 {
      return (0, String(total))
    }
    
    let totalArr = Array(String(total))
//    let over: Int = .init(String(totalArr[..<(totalArr.count - 1)]))!
    let befor = String(totalArr[..<(totalArr.count - 1)])
    let over = Int(befor)!
    
    return (over, String(totalArr.last!))
  }
  
  let aArr = Array(a).map({ String($0) }).reversed().map { $0 }
  let bArr = Array(b).map({ String($0) }).reversed().map { $0 }
  let maxIndex = max(aArr.count, bArr.count)
  
  var over: Int = 0
  var result: [String] = []
  for i in 0 ..< maxIndex {
    var aNum: Int = 0, bNum: Int = 0
    if i < aArr.count {
      let str = aArr[i]
      aNum = Int(str)!
    }
    if i < bArr.count {
      let str = bArr[i]
      bNum = Int(str)!
    }
    guard let calc = try? add(over: over, a: aNum, b: bNum) else {
      return "error"
    }
    over = calc.0
    result.append(calc.1)
  }
  if over > 0 {
    result.append("\(over)")
  }
  return result.reversed().joined()

만들다 보니 또 엄청길어졌다..........

또 "나는 4자리씩 끊어서 해야지" 라고 마음먹고 시작했으나 막상 1자리가 성공적으로 되니 귀찮아져서 포기

가산기를 만들다보니 디지털논리회로 강의때가 생각나 또 과거회상에 빠져 현재와의 비교되는 과거에 우울해졌다

그때는 이것저것 해보면서 재밌었는데 안타깝다

 

아무튼 그렇게 day25로 구성된 문제집이  day24,25 밖에 안남아서  내일로 끝이날거다 

처음 시작할때 넉넉잡아 일주일정도면 끝나겠지 했던 기초문제가 2주나 걸려버린거 생각하면 누군가 나에게 프로젝트 일정은 너가 생각한거의 두배를 말하면된다라는게 다시금 떠오른다

 

+ Recent posts