Algorithm/프로그래머스

[프로그래머스/Lv.1] 가장 가까운 같은 글자

yanni13 2024. 4. 8. 23:52

 

 

사진 눌러서 문제 풀러가기

 

 

문제 설명

 

문자열 s가 주어졌을 때, s의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다.
예를 들어, s="banana"라고 할 때,  각 글자들을 왼쪽부터 오른쪽으로 읽어 나가면서 다음과 같이 진행할 수 있습니다.

  • b는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
  • a는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
  • n은 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
  • a는 자신보다 두 칸 앞에 a가 있습니다. 이는 2로 표현합니다.
  • n도 자신보다 두 칸 앞에 n이 있습니다. 이는 2로 표현합니다.
  • a는 자신보다 두 칸, 네 칸 앞에 a가 있습니다. 이 중 가까운 것은 두 칸 앞이고, 이는 2로 표현합니다.

따라서 최종 결과물은 [-1, -1, -1, 2, 2, 2]가 됩니다.

문자열 s이 주어질 때, 위와 같이 정의된 연산을 수행하는 함수 solution을 완성해주세요.

 

 

 

 

아이디어

s 문자열이 들어갈 배열하나, 결과를 저장할 정수형 배열 하나 총 2개의 배열을 만든 다음, 반복문으로 문자열 길이 만큼 순회하며 길이가 1이상이며, 배열에서 1만큼 차이나는 동시에 같은 문자일 경우 결과배열에 1을 추가해주도록 하고, 글자가 2이상이면서 배열에서 2만큼 차이나는 같은 문자일 경우 결과 배열이 2를 추가해주도록 하였다.

 

 

작성한 코드

import Foundation

func solution(_ s:String) -> [Int] {
    var array = [Character](s) //문자열을 배열 문자열로 만들어줌
    var result = [Int]() //결과를 저장할 배열
    
    
    for i in 0..<array.count {
        if i>1 && array[i] == array[i-1] {
            result.append(1)
            // return 1
        } else {
            if i>2 && array[i] == array[i-2] {
                result.append(2)
            } else {
                result.append(-1)
            }
        }
    }
    
    return result
}

 

 

하지만 -.. 그렇게 구현하면 문자열의 길이가 길어질 수록 예외처리를 해주지 않았기 때문에 문제가 생긴다.

그래서 위에 코드에서도 테스트케이스에서 오류가 났었던 것이다.

 

그렇다고 모든 배열에서 같은 문자가 존재하는 경우를 일일이 확인해서 result.append하는 것은 코드상 너무 비효율적인 일이다.

 

 

코드

import Foundation

func solution(_ s:String) -> [Int] {
    var array = [Character](s) //문자열을 배열 문자열로 만들어줌
    var result = [Int]() //결과를 저장할 배열
    var lastPositions = [Character: Int]()
    
    
    for i in 0..<array.count {
        let char = array[i] 
        
        if let lastPos = lastPositions[char] {
            result.append(i - lastPos)
        } else {
            result.append(-1)
        }
        lastPositions[char] = i
    }
    return result
}

 

그래서 마지막 문자를 저장할 배열을 추가 생성해주었고, lastPos라는 변수를 생성해 마지막 위치를 찾아서 현재 위치와의 거리를 계산한 후 그 결과를 결과 배열에 추가해주는 방식으로 수정하였더니 테스트 결과에 성공하였다.