TIL

[TIL] 2023.11.24 | 프로그래머스 제일 작은 수 제거하기

YEN_ 2023. 11. 24. 21:17

내일배움캠프 앱개발 iOS 트랙 본캠프 1주차

Today I Learned


 

# 프로그래머스 문제 _ 링크 :: 제일 작은 수 제거하기 (Swift)

 

# 발생한 에러

알고리즘 문제를 풀다가 처음으로 시간초과를 마주했다.

시간초과는 테스트 케이스 1번에서만 발생했지만, 다른 테스트 케이스들도 이상하게 오래 걸렸다.

 

# 오류를 낸 코드

func solution(_ arr:[Int]) -> [Int] {
    guard arr.count != 0 else { return [-1] }
    let result = arr.filter{ $0 > arr.min()! }
    return arr.count <= 1 ? [-1] : result
}

141.73ms에 시간초과 실패까지...

 

# 문제점?

시간 초과라고 검색하니 똑같은 걸 계속 연산하면 그럴 수 있다고 했다.

특히 메서드를 사용하는 경우 반복 연산을 조심해야 한다고...

황당하네

 

내 경우, filter를 사용한 반복연산을 하고 있었다.

그리고 그 중에서 문제를 일으킬 만한건 요소중 제일 작은 값을 구하는 min() 메서드밖에 없다고 판단했다.

 

주어진 배열 arr의 제일 작은 수를 구하는 arr.min()! 부분을 상수로 빼내고 다시 계산을 돌렸다.

 

 

# 제대로 푼 풀이

func solution(_ arr:[Int]) -> [Int] {
    guard arr.count != 0 else { return [-1] }
    let minValue = arr.min()!
    let result = arr.filter{ $0 > minValue }
    return arr.count <= 1 ? [-1] : result
}

 

일단 1번도 제대로 통과 되었고 나머지도 시간이 많이 줄었다.

확실히 filter 안에서 메서드를 반복 연산을 돌린게 문제였나 보다.

메서드를 사용할 경우에는 한 번만 연산하고 그 값을 활용하는 방향으로 풀어야겠다.

 

배열의 정확한 길이가 조건으로 나오지 않았으니까 1번은 엄청나게 긴 배열이 arr로 주어진 것일까?

그것은 나는 모르는 일이다...

 

 

 

# 덤으로 하는 주저리

오늘은 튜터님의 TIL 특강이 있었다.

평소에도 기록하는 걸 즐기는 편이라 이런 거 쓸 때 크게 어렵지는 않았는데, 내용 목차를 어떻게 할 지는 고민을 하고 있었다.

마침 특강 내용중에 관련된 부분이 있어 기뻤다.

그 중에 문제 해결 과정 유형으로 쓴 TIL 을 유심히 보고 오늘은 그 양식대로 적어봤다.

맘에 드니까 알고리즘 관련 TIL을 쓸 때는 이 목차를 사용해야겠다!!

 

 

# 문제 해결 과정 TIL

  1. 발생 에러, 버그 작성
  2. 오류 발생 코드 작성
  3. 문제점 분석, 가설 세우기
  4. 원인은 무엇이고 어떻게 해결했는지
  5. 해결 과정 중 느낀 점, 개선 방안 작성