diff --git "a/\355\225\234\352\267\274\354\230\201/.DS_Store" "b/\355\225\234\352\267\274\354\230\201/.DS_Store" new file mode 100644 index 0000000..bd0491b Binary files /dev/null and "b/\355\225\234\352\267\274\354\230\201/.DS_Store" differ diff --git "a/\355\225\234\352\267\274\354\230\201/2\352\260\234\354\235\264\355\225\230\353\241\234\353\213\244\353\245\270\353\271\204\355\212\270_level2.swift" "b/\355\225\234\352\267\274\354\230\201/2\352\260\234\354\235\264\355\225\230\353\241\234\353\213\244\353\245\270\353\271\204\355\212\270_level2.swift" new file mode 100644 index 0000000..83cac15 --- /dev/null +++ "b/\355\225\234\352\267\274\354\230\201/2\352\260\234\354\235\264\355\225\230\353\241\234\353\213\244\353\245\270\353\271\204\355\212\270_level2.swift" @@ -0,0 +1,35 @@ +//220331 +//프로그래머스 [level2] 2개 이하로 다른 비트 문제 +//https://programmers.co.kr/learn/courses/30/lessons/77885 + +import Foundation + +func solution(_ numbers:[Int64]) -> [Int64] { + var answer = [Int64]() + for n in numbers { + var bit = String(Int(n),radix:2).map{String($0)} + if bit.last! == "0" { + bit[bit.count-1] = "1" + } else if let zeroIndex = bit.lastIndex(of:"0"){ + bit[zeroIndex] = "1" + bit[zeroIndex+1] = "0" + } else { + bit.insert("1",at:0) + bit[1] = "0" + } + answer += [Int64(bit.joined(separator:""),radix:2)!] + } + return answer +} + +/* +다른 사람 풀이(이렇게 비트 연산 이용해서) + +func solution(_ numbers: [Int64]) -> [Int64] { + return numbers.map(f) +} + +func f(_ number: Int64) -> Int64 { + return (number | ~number & (number + 1)) & ~((~number & (number + 1)) >> 1) +} +*/ \ No newline at end of file diff --git "a/\355\225\234\352\267\274\354\230\201/\355\201\260\354\210\230\353\247\214\353\223\244\352\270\260_level2.swift" "b/\355\225\234\352\267\274\354\230\201/\355\201\260\354\210\230\353\247\214\353\223\244\352\270\260_level2.swift" new file mode 100644 index 0000000..1318444 --- /dev/null +++ "b/\355\225\234\352\267\274\354\230\201/\355\201\260\354\210\230\353\247\214\353\223\244\352\270\260_level2.swift" @@ -0,0 +1,79 @@ +//220329 +//프로그래머스 [level2] 큰 수 만들기 문제 +//https://programmers.co.kr/learn/courses/30/lessons/42883 + +//최종! +import Foundation + +func solution(_ number:String, _ k:Int) -> String { + let nArr = number.map{String($0)} + var answer = [String]() //stack + var erase = 0 + var i = 0 + while(k>erase){ + if i == nArr.count{ + answer.removeLast() + erase += 1 + }else if answer.count == 0 || answer.last! >= nArr[i]{ + answer += [nArr[i]] + i += 1 + } else if answer.last! < nArr[i]{ + answer.removeLast() + erase += 1 + } + } + answer += Array(nArr[i...]) + return answer.joined(separator:"") +} + + +/* +func solution(_ number:String, _ k:Int) -> String { + var nArr = number.map{String($0)} + var erase = 0 + var i = 0 + while(k>erase){ + if i == nArr.count-1 { + nArr.removeLast() + erase += 1 + }else if nArr[i] < nArr[i+1] { + nArr.remove(at:i) + erase += 1 + i = 0 + } else{ + i += 1 + } + } + return nArr.joined(separator:"") +}*/ +//654321 k=1 65432 +//654321 k=5 6 +//11111117 k=5 + +/*다른 사람 풀이 +import Foundation + +func solution(_ number:String, _ k:Int) -> String { + let numbers = number.compactMap{ Int(String($0))} + + var sub: [Int] = [] + + var k = k + + for (i,e) in numbers.enumerated() { + while k>0, sub.isEmpty == false, sub.last! < e { + k-=1 + sub.removeLast() + } + + if k == 0 { + sub.append(contentsOf: numbers[i...]) + break + } else { + sub.append(e) + } + } + + return sub[..<(sub.count-k)].map {String($0)}.joined() +} +*/ \ No newline at end of file diff --git "a/\355\225\234\352\267\274\354\230\201/\355\214\214\354\235\274\353\252\205\354\240\225\353\240\254_level2.swift" "b/\355\225\234\352\267\274\354\230\201/\355\214\214\354\235\274\353\252\205\354\240\225\353\240\254_level2.swift" new file mode 100644 index 0000000..2ac0213 --- /dev/null +++ "b/\355\225\234\352\267\274\354\230\201/\355\214\214\354\235\274\353\252\205\354\240\225\353\240\254_level2.swift" @@ -0,0 +1,75 @@ +//220331 +//프로그래머스 [level2] 파일명 정렬 문제 +//https://programmers.co.kr/learn/courses/30/lessons/17686 + +//파일명이 숫자로 끝날경우 number 부분 주의 필요 +func solution(_ files:[String]) -> [String] { + var arr: Array = [] + + for f in files { + let lowerArray = f.map{$0.lowercased()} + let nums = lowerArray.filter{Character($0).isNumber == true} + let numberFirstIndex = lowerArray.firstIndex(of:nums[0])! + let head = Array(lowerArray[.. { return "0"..."9" } + var head: String{ + return self.prefix { numeric.contains($0) == false }.uppercased() + } + var number: Int { + return Int( self.drop { numeric.contains($0) == false} + .prefix { numeric.contains($0) == true })! + } +} + +func solution(_ files:[String]) -> [String] { + + return files.enumerated().sorted { (lhs, rhs) in + let l = lhs.element + let r = rhs.element + if l.head != r.head { return l.head < r.head} + if l.number != r.number { return l.number < r.number} + return lhs.offset < rhs.offset + + }.map{ $0.element } +} +*/ \ No newline at end of file diff --git "a/\355\225\234\352\267\274\354\230\201/\355\224\204\353\240\214\354\246\2104\353\270\224\353\241\235_level2.swift" "b/\355\225\234\352\267\274\354\230\201/\355\224\204\353\240\214\354\246\2104\353\270\224\353\241\235_level2.swift" new file mode 100644 index 0000000..c131d79 --- /dev/null +++ "b/\355\225\234\352\267\274\354\230\201/\355\224\204\353\240\214\354\246\2104\353\270\224\353\241\235_level2.swift" @@ -0,0 +1,54 @@ +//220328 +//프로그래머스 [level2] 프렌즈4블록 문제 +//https://programmers.co.kr/learn/courses/30/lessons/17679 + +func solution(_ m:Int, _ n:Int, _ board:[String]) -> Int { + var pre_answer = 0 + var answer = 0 + var answerArr = [[Int]]() + var arr = Array(repeating:Array(repeating:"0",count:n),count:m) + for (i,b) in board.enumerated(){ + arr[i] = b.map{String($0)} + } + + repeat{ + pre_answer = answer + //행,열 탐색해서 같은 거 있으면 answerArr에 좌표 넣기 + for i in stride(from:0,to:m-1,by:1){ //행 + for j in stride(from:0,to:n-1,by:1){ //열 + if arr[i][j] == "0" {continue} + if arr[i][j] == arr[i+1][j] && arr[i][j] == arr[i][j+1] && arr[i][j] == arr[i+1][j+1]{ + answerArr = answerArr + [[i,j]]+[[i+1,j]]+[[i,j+1]]+[[i+1,j+1]] + } + } + } + + //answerArr 중복 없애기 + answerArr = Array(Set(answerArr)) + + //answerArr에 있는 좌표 모두 0 만들기 + answer += answerArr.count + for i in answerArr{ + arr[i[0]][i[1]] = "0" + } + + //arr 배열 재배치 + for j in stride(from:0,to:n,by:1){ //열 + var first = 0 //블록이 내려와야할 행 위치 + if arr[m-1][j] == "0" {first = m-1} + for i in stride(from:m-2,through:0,by:-1){ //행 + if arr[i][j] == "0"{ + if i>first {first = i } + } + else if arr[i+1][j] == "0"{ + arr[first][j] = arr[i][j] + arr[i][j] = "0" + first -= 1 + } + } + } + //answerArr 다시 빈 배열 만들기 + answerArr = [[Int]]() + } while(pre_answer