알고리즘

프로그래머스 LV.1 덧칠하기 스위프트

Thor_yeom 2023. 5. 2. 10:33

 

문제에 대한 이해 

  • 중복으로 칠 할 수 있음
  • 배열안에 있는 숫자는 꼭 한번은 칠해야 함 

예제 그림을 보면 이해하기 쉽습니다.

paint2 를 보면 2 ~ 5까지 칠했고, 그 다음에는 3 ~ 6 까지 칠했습니다.

결론적으로는 시작을 section 첫번째 인덱스부터 시작해서 m-1만큼 더하면 되는 문제입니다.

 

그럼 코드를 작성해보겠습니다.

 

1. m-1을 활용하여 코드 작성하기 

func solution(_ n:Int, _ m:Int, _ section:[Int]) -> Int {

    var answer = 0
  	// section의 첫번째 값과 m-1이 담기는 변수를 만들어줍니다.
    var painted = 0
    
    for i in 0..<section.count {
    	// section의 첫번째 인덱스가 0보다 크다면을 적용하여 첫번째 인덱스에서 + m-1이 될 수 있게 작성합니다.
        if section[i] > painted {
            painted = section[i] + m - 1
            answer += 1
        }
    }


    return answer
}

 

 

 

 

2. + m을 활용하여 코드 작성하기 

 

뭔가  코드를 조금 더 다른방법으로 활용할 수있을 거 같다는 느낌이 들어서

m-1 보다 m을 더해주었고, >=를 활용해봤습니다. 

 

구하는 식은 다음과 같습니다.

func solution(_ n:Int, _ m:Int, _ section:[Int]) -> Int {
    
    // section의 첫번째 인덱스
    var now = section[0]
    // 최소 횟수 
    var counter = 0

    return counter
}

 

section의 첫번째 인덱스를 구하기 위해 section[0]을 직접적으로 가져옵니다.

 

for문으로 section의 값을 하나씩 뽑으면서 m을 더해주고 더한 값이 section의 요소보다 크면 count를 1 올려줍니다.

func solution(_ n:Int, _ m:Int, _ section:[Int]) -> Int {
    
    // 2
    var now = section[0]
    var counter = 0
    
    for i in section {
    	// 첫번째 인덱스와 비교해야 하기 때문에 >=를 해준다
        // >= 가 아니고 > 를 해주게 되면 두번째 인덱스 부터 시작한다.
    	if i >= now {
        	count += 1
        	now = i + m
        }
    }

    return counter
}

 

자...이렇게 실행을 해보니

 

테스트 케이스 17번에서 런타임 에러가 발생했습니다. 

왜 그랬나 찾아보니... section이 빈 배열일때  section[0]을 비교하려고 해서 발생하는 에러 였습니다.

 

해결방법으로는 다음 코드와 같습니다.

import Foundation

func solution(_ n:Int, _ m:Int, _ section:[Int]) -> Int {
    
    // section이 비어있다면 0을 리턴 
    guard !section.isEmpty else {
        return 0
    }
    
    var now = section[0]
    var counter = 0
    
    for s in section {
        if s >= now {
            counter += 1
            now = s + m
        }
    }

    return counter
}