우선 중첩으로 돈을 쌓는다는 개념에서 for구문이 바로 떠올랐다.
import Foundation
func solution(_ price:Int, _ money:Int, _ count:Int) -> Int{
var Nprice = 0
var answer = 0
for i in 0...count{
if Nprice <= money{
Nprice += price * i
if Nprice >= money {
answer = Nprice - money
}
}
}
return answer
}
이런식으로 했는데,문제를 다시 자세히 읽어보니 count가 정해져있어서 굳이 if 문이 필요하지도 않으며 입력한 if문이 틀렸다. 그리하여
import Foundation
func solution(_ price:Int, _ money:Int, _ count:Int) -> Int{
var Nprice = 0
var answer = 0
for i in 0...count{
Nprice += price * i
if Nprice >= money {
answer = Nprice - money
}
}
return answer
}
이런식으로 필요없던 if문 하나를 지웠다.
다른 사람의 풀이는
import Foundation
func solution(_ price:Int, _ money:Int, _ count:Int) -> Int{
return max((count + 1) * count / 2 * price - money , 0)
}
위처럼 등차수열의 공식을 이용해서 풀이했다. 이런 문제에선 수학공식도 다시 한번 복기할 필요가 있어보인다.
약수의 갯수를 카운팅하기로 했다.
import Foundation
func solution(_ left:Int, _ right:Int) -> Int {
var divisorcount = 0
for i in left...right{
for divisor in 1...i{
if i % divisor == 0{
divisorcount += 1
}
}
if divisorcount % 2 == 0{
i += i
}else {
i -= i
}
return i
}
}
뚝딱 만들어낸 것같지만 엄청 오래동안 고치고 지우고를 반복했다. 그래도 오류가 발생했는데 i는 let형식인 것 같다.
그리고 리턴값도 for문 밖에 써야한다.
import Foundation
func solution(_ left:Int, _ right:Int) -> Int {
var divisorcount = 0
var result = 0
for i in left...right{
for divisor in 1...i{
if i % divisor == 0{
divisorcount += 1
}
}
if divisorcount % 2 == 0{
result += i
}else {
result -= i
}
}
return result
}
오류는 발생 하지 않았는데 정답이 틀렸다. 알고리즘적으로 조금만 수정하면 될 듯하다.
import Foundation
func solution(_ left:Int, _ right:Int) -> Int {
var result = 0
for i in left...right{
var divisorcount = 0
for divisor in 1...i{
if i % divisor == 0{
divisorcount += 1
}
}
if divisorcount % 2 == 0{
result += i
}else {
result -= i
}
}
return result
}
divisorcount가 매번 리셋되어야 하기때문에 for문안으로 넣어주는게 맞다. 많이 알게 되었다.
func solution(_ left: Int, _ right: Int) -> Int {
return (left...right).map { i in (1...i).filter { i % $0 == 0 }.count % 2 == 0 ? i : -i }.reduce(0, +)
}
진짜 극단적으로 줄인 답안지도 있었다. 정말 알고리즘에 많이 쓰이는 map filter reduce를 골고루 적절하게 사용했다. 나도 이런 답안을 보면서 사용법에 대한 이해를 좀 더 익혀야겠다.
배열로 변환해서 인덱스와 관련되게 해결하면 될 것 같다.
import Foundation
func solution(_ s:String) -> Int{
var sarray = Array(s)
for i in 0..<sarray.count-1{
if sarray[i] == sarray[i+1]{
sarray.remove(at: i+1)
sarray.remove(at: i)
}
}
if sarray.isEmpty == true{
return 1
}else {
return 0
}
}
고심끝에 코드를 적어내렸는데 또 dumped 오류가 발생했다. 이 오류는 대부분 인덱스가 범위를 초과했을때 발생했다. 다시 생각해보자. 짐작이 맞다면 sarray함수가 제거되면서 인덱스 갯수가 적어져서 발생하는 문제 같다.
import Foundation
func solution(_ s:String) -> Int{
var sarray = Array(s)
var Carray: [Int] = []
for i in 0..<sarray.count-1{
if sarray[i] == sarray[i+1]{
Carray.append(i)
Carray.append(i+1)
}
}
if Carray.count == sarray.count {
return 1
}else {
return 0
}
}
아예 작전을 바꿔 삭제된 인덱스의 갯수가 원형의 sarray의 갯수와 같다면 리턴하는 형식으로 바꿨다. 그래도 정답이 틀렸다. 그런데 이 방법은 인덱스가 삭제되질않아서 테트리스처럼 같은 것들끼리 여러번 사라질 수가 없었다..
인덱스 문제를 해결할 방법이 떠오르질 않는다.
func solution(_ s: String) -> Int {
var stack: [Character] = []
for char in s {
if let top = stack.last, top == char {
stack.removeLast()
} else {
stack.append(char)
}
}
return stack.isEmpty ? 1 : 0
}
결국 답지를 열어봤는데, stack의 개념으로 풀이했다.
완벽하게 이해하진 못했는데 스택의 개념에대해서 나와있던 부분을 다시 한번 봐야겠다.