문제에서 주어짐, 첫번째 목록의 우선순위가 대기중인 작업의 우선순위보다 낮다면 무조건 대기순위 뒤로 이동
대기중인 작업중 우선 순위가 더 큰게 없다면 대기순위에서 제거)
세번째 - 찾으려는 타깃이 언제 완료되는가 리턴
struct Work {
let id:Character
let priority:Int
}
func solution(_ priorities:[Int], _ location:Int) -> Int {
var works = [Work]()
var endArray = [Work]()
var lastId:Character = "a"
for priority in priorities {
let work = Work(id: lastId, priority: priority)
lastId = Character(Unicode.Scalar((lastId.unicodeScalars.first!.value) + 1)!)
works.append(work)
}
guard location < works.count else { return -1 }
let findTarget = works[location]
while works.count > 0 {
let target = works[0]
var notFind = true
for i in 1 ..< works.count {
// 뒷 대기열에 큰게 있다면 notFind = false
}
if notFind {
// 대기열에서 제거 endArray에 추가
}
}
for i in 0 ..< endArray.count {
// 찾으려는 id와 같은것의 i값 리턴
}
return -1
}
퍼센트지가 들어있는 배열(progresses)이 각각 루프 1당(문제에서의 하루) speeds 배열의 값 만큼 진행되어서
퍼센트지가 100%로 다 채워졌을때가 몇 루프인지 계산하는 문제이다.
계산시에 progresses의 값이 들어있는 순서대로 뒷 값이 작은게 몇개인지 저장하고 그 값을 리턴해주면 된다.
나는 우선 퍼센트지가 전부다 찼을때의 루프수를 저장해놓기위해 complete배열을 progresses배열의 수 만큼 작성해두고.
progresses를 foreach문을 통해
내부에 while문으로 퍼센트치를 채워넣으면서 루프수(foreach문안의 변수 day)를 저장했다
그후 while문을 통해 complete배열이 앞값과 뒷값을 비교해가며 뒷값이 작을때 +1 뒷값이 클때 다시1 부터 카운트식으로 하여 코드를 짯다.
총 두 두분으로 나눠서 했다.
var complete = Array<Int>(repeating: 0, count: progresses.count)
for (i, persent) in progresses.enumerated() {
var day = 0
var persent = persent
while persent < 100 {
persent += speeds[i]
day += 1
}
complete[i] = day
}
var i = 0
var result = [Int]()
while i < complete.count {
var commit = 1
if (i + 1) >= complete.count {
result.append(commit)
break
}
for k in (i + 1) ..< complete.count {
if complete[i] >= complete[k] {
commit += 1
} else { break }
}
i += commit
result.append(commit)
}
return result
저 사이트는 다른이의 답도 볼 수 있는 서비스를 제공하는데 보고 오니 정말 내 소스가 좀 부끄러워진다.
이번 문제는 배열의 탐색을 묻는 문제인가 싶다.
세명의 사람이 있고
첫번째 사람은 1,2,3,4,5 ... 1,2,3,4,5 순으로 답을 적고
이런식으로 세명의 정답 적는 배열이 주어진다.
세명의 점수를 정답 배열에서 계속 비교해야해서
해당 내용을 난 TestPaper라는 구조체를 만들어 정리했다.
그 후 각각의 총점을 계산하고
각각의 점수를 기준으로 정렬하고 가장 앞에 있는 사람을 뽑는것으로 톱을 정하고
혹시 톱과 같은 점수가 있는지 filter함수를 통해 사람을 추가로 뽑았다.
struct TestPaper {
let id:Int
private let loopAnsers:[Int]
private var loopIndex:Int = 0
var score = 0
var answer: Int {
mutating get {
let index = loopIndex
self.loopIndex += 1
if loopIndex >= loopAnsers.count { self.loopIndex = 0 }
return self.loopAnsers[index]
}
}
init(id:Int,loopAnsers:[Int]) {
self.id = id
self.loopAnsers = loopAnsers
}
}
func solution(_ answers:[Int]) -> [Int] {
var people:[TestPaper] = [
TestPaper(id: 1, loopAnsers: [1,2,3,4,5]),
TestPaper(id: 2, loopAnsers: [2,1,2,3,2,4,2,5]),
TestPaper(id: 3, loopAnsers: [3,3,1,1,2,2,4,4,5,5])
]
// calc score
for answer in answers {
for index in 0 ..< people.count {
if answer == people[index].answer {
people[index].score += 1
}
}
}
// get top
let top = people.sorted(by: {$0.score > $1.score}).first!
// get result
var result = [Int]()
for person in people.filter({ $0.score == top.score}) {
result.append(person.id)
}
return result
}