Skip to content

[Algorithm] [3차] 압축 #165

Description

@hwangJi-dev

💬 문제

https://school.programmers.co.kr/learn/courses/30/lessons/17684


💬 Idea

  • 먼저 msg 문자열을 Array형태로 변환한 뒤 배열을 뒤집는다.
    • 가장 첫번째 문자를 스택처럼 popLast하기 위해
  1. 현재 입력과 일치하는 가장 긴 문자열을 찾기 위해 msg의 마지막 원소가 있을 때까지 popLast()를 수행한다.
    • popLast()한 값을 word 변수에 더해준다.
      • 이 때 word + c(msg의 last값)가 사전에 있다면 또 다음 긴 문자를 찾기 위해 반복한다.
      • 이 때 word + c(msg의 last값)가 사전에 없다면 해당 값을 사전에 등록하고 반복문을 멈춘다.
        • 사전에 등록할 때 사전의 마지막 값을 + 1 하여 업데이트 해준다.
  2. 현재 입력과 일치하는 가장 긴 문자열은 word 변수와 일치하므로 ans 배열에 사전의 word 값을 append해준다.
  3. msg 배열이 빌 때까지 1-2 과정을 반복한다.

💬 풀이

func solution(msg:String)->[Int]{varmsg=Array(msg).reversed().map({String($0)})vardict:[String:Int]=["A":1,"B":2,"C":3,"D":4,"E":5,"F":6,"G":7,"H":8,"I":9,"J":10,"K":11,"L":12,"M":13,"N":14,"O":15,"P":16,"Q":17,"R":18,"S":19,"T":20,"U":21,"V":22,"W":23,"X":24,"Y":25,"Z":26]vardictLastVal=26varans:[Int]=[]while !msg.isEmpty {varword=""whilelet w = msg.popLast(){
word += w
iflet c = msg.last {ifdict[word + c]==nil{
dictLastVal +=1dict[word + c]= dictLastVal
break}}}
ans.append(dict[word]!)}return ans
}

💬 더 나은 방법?

  • 문제를 풀면서 사전에 이미 정의되어있는 1개의 단어들을 일일이 초기화해줬는데,
    Unicode.Scalar를 통해 숫자를 이용해서 알파벳을 차례대로 표현할 수 있다는 걸 알게되었다.
    • 대문자 알파벳 A를 Unicode.Scalar(65)로 표현할 수 있다.
    • 이후 차례대로 26개의 알파벳을 표현한다.
vardict:[String:Int]=[:]foriin1...26{iflet scalar =Unicode.Scalar(64+ i){dict[scalar.description]= i
}}
// dict
// ["A": 1, "B": 2, "C": 3, "D": 4, "E": 5, "F": 6, "G": 7, "H": 8, "I": 9, "J": 10, "K": 11, "L": 12, "M": 13, "N": 14, "O": 15, "P": 16, "Q": 17, "R": 18, "S": 19, "T": 20, "U": 21, "V": 22, "W": 23, "X": 24, "Y": 25, "Z": 26]

💬 알게된 것

✅ Unicode.Scalar

  • 크기가 가변적인 String 문자열을 하나하나 개별적으로 접근하기 위한 방법.
  • Unicode기반 21-bit 코드
  • UTF-32랑 거의 동일하다.
  • 하나 이상의 Unicode Scalar가 모여 Character를 이룬다.
  • 숫자 표현에서 직접 유니코드 스칼라 값을 생성할 수 있다.
    • Unicode.Scalar(65) // “A”

<참고>

[https://velog.io/@haze5959/Swift-Unicode-Scalar-그리고-문자열-count-시간-복잡도-관계](https://velog.io/@haze5959/Swift-Unicode-Scalar-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EB%AC%B8%EC%9E%90%EC%97%B4-count-%EC%8B%9C%EA%B0%84-%EB%B3%B5%EC%9E%A1%EB%8F%84-%EA%B4%80%EA%B3%84)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions