https://school.programmers.co.kr/learn/courses/30/lessons/17684
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
1. Unicode와 딕셔너리를 이용해 key값을 A - Z (String)까지 value 값을1 -26 (Int)까지 알맞게 데이터 저장
2. 파라미터 msg의 인덱스를 이용하여 문자열을 잘랐음
3. 자른 문자열을 딕셔너리가 가지고 있지 않을때를 기준으로 dic에 데이터를 저장하도록 하였음
이때 두개 이상의 문자길이를 가지고 있을 경우 다음 입력의 순서를 건너 뛰어야 하므로 wcount를 사용하였음
4.endNum이 msg.count에 도달하게 되면 더 이상 입력할 것이 없으므로 result에 추가하고 리턴하도록 하였음
func solution(_ msg:String) -> [Int] {
let initalAlphabet = Unicode.Scalar("A").value
let endAlphabet = Unicode.Scalar("Z").value
var dic: [String : Int] = [:]
var count = 0
for i in initalAlphabet...endAlphabet{
if let alphabet = Unicode.Scalar(i){
count += 1
dic[String(alphabet)] = count
}
}
/*
1. Unicode와 딕셔너리를 이용해 key값을 A - Z (String)까지 value 값을1 -26 (Int)까지 알맞게 데이터 저장
현재 count = 26 (Z)
*/
var startNum = 0
var endNum = 0
var result:[Int] = [Int]()
while startNum < msg.count{
var wcount = 0
var w:String = ""
for i in startNum+1...msg.count{ // 문자열의 범위는 시작점보다 크고 msg.count까지
endNum = i
let startIndex = msg.index(msg.startIndex, offsetBy: startNum)
let endIndex = msg.index(msg.startIndex, offsetBy: endNum)
var slice_msg = msg[startIndex..<endIndex]
if dic.keys.contains(String(slice_msg)){
w = String(slice_msg)
wcount += 1
} // wcount를 이용해 1보다 클경우, 다음 문자열에 접근하는 것이 아니라 거리만큼 다음 이동후 문자열에 접근하도록 함
else{
if wcount > 1 {
startNum = startNum + (wcount - 1)
} //다음 문자열시작지점 이동
count += 1
dic[String(slice_msg)] = count
result.append(dic[w] ?? -1)
wcount = 0
break
} // dic에 없으므로 데이터 저장하고 출력
if i == msg.count{
result.append(dic[w] ?? -1)
return result
} //마지막 문자열에 접근했으므로 출력하고 반환
}
startNum += 1
}
return result
}
'Swift랑 친해지기 > programmers 풀기' 카테고리의 다른 글
[프로그래머스] 타겟넘버 (Swift) ※1,2번 실행초과 (0) | 2023.07.12 |
---|---|
[프로그래머스] 피로도 (Swift) (0) | 2023.07.10 |
[프로그래머스] 2개 이하로 다른 비트 (Swift) -10,11 실행초과 (0) | 2023.06.18 |
[프로그래머스] 덧칠하기 (Swift) (3) | 2023.06.07 |
[프로그래머스] 2021 Dev-Matching: 웹 백엔드 개발자(상반기)행렬 테두리 회전하기 (Swift) (0) | 2023.06.01 |