[내일배움캠프 9일차] 알고리즘: 중복된 문자 제거

NH·2025년 3월 13일

내일배움캠프

목록 보기
9/62
post-thumbnail

📌 TIL: [알고리즘] 중복된 문자 제거

알고리즘을 공부하기 위해 프로그래머스 웹에서 중복된 문자 제거 라는 문제를 풀었다.
프로그래머스 중복된 문자 제거 👉 이동하기


📝 오늘 배운 내용

  • 문자열을 Character 배열로 변환 하는 방법
  • String 타입과 Character 타입은 비교연산이 안되는 것
  • contains 메서드 가 무엇이고, 사용하는 방법

1️⃣ 첫 시도

내가 생각한 풀이 방법

  1. 문자열을 Character 배열로 변환
  2. 변환한 배열을 자기들 끼리 비교 (2중 for문 사용)
  3. 같은 문자를 발견하면 중복문자를 저장하는 배열에 저장
  4. 중복 문자 배열에 이미 존재하는 문자면 저장 X
  • 코드

    func solution(_ my_string:String) -> String {
       var string: String = "Hello, World!"
       let stringArr = Array(string) // 문자열을 Character배열로 변환
    
       var temp: [String] = [] // 중복 글자 저장 배열
    
       for word in stringArr {
           for i in 0...stringArr.count {
               if word == stringArr[i] {
                   if temp[i] !== word {
                       temp.append(word)
                   }
               }
           }
       }
       let result = String(temp)
      
       return result
    }
  • 결과: 에러 발생

    Cannot convert value of type 'String.Element' (aka 'Character') to expected argument type 'String'

2️⃣ 두번째 시도

temp를 String 배열에서 Character 배열로 변경

func solution(_ my_string:String) -> String {
    let string = my_string
    let stringArr = Array(string)
    //let charArr = Array(string) // 문자열을 캐릭터 배열로 변환
    //let stringArray = charArray.map { String($0) } // 다시 문자열 배열로 전환
    var temp: [Character] = [] // 중복 글자 저장 배열
    
    for word in stringArr {
        for i in 0...stringArr.count {
            if word == stringArr[i] {
                if temp[i] != word {
                    temp.append(word)
                }
            }
        }
    }
    
    
    let result = String(temp)
    
    return result
}
  • 결과: temp[i] !== word 구문 에러 발생
    • Fatal error: Index out of rang
    • temp[i]에서 i가 temp 범위 밖으로 벗어나서 생기는 오류로 보임

3️⃣ 세번째 시도

풀이 방법 변경

  • 변경 사유:
    • 2중 for 문을 사용하여 중복을 비교 시, 문자를 저장한 배열과 중복문자를 저장항 배열의 인덱스 범위 차이로 인해 Fatal error: Index out of rang 오류 방생
  • 변경한 풀이 방법
    • contains 메서드 사용하여 중복 문자 확인
func solution(_ my_string:String) -> String {
    let string = my_string
    let stringArr = Array(string) // 문자열을 캐릭터 배열로 변환
    var temp: [Character] = [] // 중복 글자 저장 배열
    
    for word in stringArr {
        if !temp.contains(word) {
            temp.append(word)
        }
    }
    
    let result = String(temp) // Character 배열을 String 타입으로 변경
    print(result)
    
    return result
}
  • 결과: 성공✨

🚨 트러블 슈팅

🤔 첫번째 시도 에러

Cannot convert value of type 'String.Element' (aka 'Character') to expected argument type 'String'

원인

  • String 타입과 Char 타입을 !== 비교 연산했다.

원인 분석

  • String.Element(즉, Character)String의 타입 불일치

해결

  • wordCharacter인데, temp[String]이므로 temp.append(word)에서 타입이 맞지 않아 오류가 발생
  • temp 배열을 [Character]로 선언하여 해결

🤔 두번째 시도 에러

원인

  • temp[i]에서 itemp 범위 밖으로 벗어나서 생기는 오류로 보임

원인 분석

  • 2중 for 문을 사용하여 비교를 하려고 해서 temp 배열에 대해 신경을 못썼다.
  • temp 배열이 비어있는데, i의 값이 커지면서 Index out of rang 오류 발생
  • 배열은 index 값이 넘어가면 에러가 발생하는 것을 알게되었다.

해결

  • 2중 for 문 👉 contains 메서드로 변경
  • contains 메소드는 배열안에 있는 특정 문자가 포함되어 있는지를 확인하는 메소드다.
  • contains를 이용하여 중복 문자를 확인하는 로직으로 변경하여 해결

오늘 배운 것들

문자열 및 배열 관련 함수들

문자열 -> [Character]

  • Array() 로 감싸준다.
let string = "pppeplwkke"
let stringArr = Array(string)

[Character] -> 문자열

  • String() 으로 감싸준다.
let charArr: [Character] = ["a","b","c","d"]
let string = String(charArr)

[Character] -> [String]

  • map 함수를 사용하면 쉽게 변경할 수 있다.
let stringArray = charArray.map { String($0) }

[String] -> String

  • joined 를 사용하면 된다.
let arr = ["Hi", "Jun"]
let str = arr.joined(separator: "")

포함된 문자 찾는 메소드 contains

  • contains는 컬렉션(Array, Set, Dictionary 등)에 특정 요소가 포함되어 있는지를 확인하는 메서드
let country: [String] = ["korea", "usa", "uk"]
if country.contains("korea") {
print("포함되어 있습니다.")
}

✍️ 배운점과 느낀점

1️⃣ StringCharacter 를 비교 연사자를 사용할 수 없다.
2️⃣ 배열의 index를 넘기면 오류가 발생한다.
3️⃣ 내가 모르는 메소드들이 많다.
4️⃣ 메소드를 잘 사용하면 코드가 간결해진다.

👉 앞으로도 알고리즘 공부를 열심히 해서 간결하고 쉽게 코드를 설계하는 습관을 길러야겠다. 🚀

profile
iOS 개발 블로그

0개의 댓글