프로그래머스- 37

김정현·2023년 5월 18일
0

프로그래머스

목록 보기
37/46

1.

우선 중첩으로 돈을 쌓는다는 개념에서 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)
}

위처럼 등차수열의 공식을 이용해서 풀이했다. 이런 문제에선 수학공식도 다시 한번 복기할 필요가 있어보인다.

2.

약수의 갯수를 카운팅하기로 했다.

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를 골고루 적절하게 사용했다. 나도 이런 답안을 보면서 사용법에 대한 이해를 좀 더 익혀야겠다.

(Level2) 3.

배열로 변환해서 인덱스와 관련되게 해결하면 될 것 같다.

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의 개념으로 풀이했다.
완벽하게 이해하진 못했는데 스택의 개념에대해서 나와있던 부분을 다시 한번 봐야겠다.

0개의 댓글