[level 1] 숫자 문자열과 영단어 - 81301
성능 요약
메모리: 16.5 MB, 시간: 0.07 ms
구분
코딩테스트 연습 > 2021 카카오 채용연계형 인턴십
채점결과
정확성: 100.0
합계: 100.0 / 100.0
제출 일자
2024년 05월 11일 14:03:31
문제 설명
네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
- 1478 → "one4seveneight"
- 234567 → "23four5six7"
- 10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s
가 매개변수로 주어집니다. s
가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.
참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.
숫자 | 영단어 |
---|---|
0 | zero |
1 | one |
2 | two |
3 | three |
4 | four |
5 | five |
6 | six |
7 | seven |
8 | eight |
9 | nine |
제한사항
- 1 ≤
s
의 길이 ≤ 50 s
가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.- return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만
s
로 주어집니다.
입출력 예
s | result |
---|---|
"one4seveneight" |
1478 |
"23four5six7" |
234567 |
"2three45sixseven" |
234567 |
"123" |
123 |
입출력 예 설명
입출력 예 #1
- 문제 예시와 같습니다.
입출력 예 #2
- 문제 예시와 같습니다.
입출력 예 #3
- "three"는 3, "six"는 6, "seven"은 7에 대응되기 때문에 정답은 입출력 예 #2와 같은 234567이 됩니다.
- 입출력 예 #2와 #3과 같이 같은 정답을 가리키는 문자열이 여러 가지가 나올 수 있습니다.
입출력 예 #4
s
에는 영단어로 바뀐 부분이 없습니다.
내가 푼 풀이
func solution(_ s:String) -> Int {
let wordtonum: [String:String] = ["zero": "0", "one": "1", "two": "2", "three": "3", "four": "4", "five": "5", "six": "6", "seven": "7", "eight": "8", "nine": "9"]
var answer = ""
var temp = ""
for char in s {
if char.isNumber {
answer.append(char)
} else {
temp.append(char)
if let num = wordtonum[temp] {
answer.append(num)
temp = ""
}
}
}
return Int(answer) ?? 0
}
wordtonum을 통해 딕셔너리 구조로 숫자를 나열한다.
var answer = ""
var temp = ""
빈 문자열을 초기화해서 answer는 최종 반환 값이 들어가도록 하고 temp는 현재 처리중인 영단어를 저장하도록 한다.
for char in s {
if char.isNumber {
answer.append(char)
문자열 s 를 문자 단위로 순회하고 char가 숫자일때 answer에 추가하도록 한다.
} else {
temp.append(char)
if let num = wordtonum[temp] {
answer.append(num)
temp = ""
}
숫자가 아닐 경우에 영단어 이므로 temp에 해당 단어를 추가한 후 temp가 wordtonum에 해당하는 숫자가 있는지 확인한다. 해당 내용이 있다면 키 값에 대한 벨류 값이 answer에 추가되도록 한 후 temp를 빈문자열로 변환한다.
다른 사람의 풀이
func solution(_ s:String) -> Int {
let arr = ["zero","one","two","three","four","five","six","seven","eight","nine"]
var str = s
for i in 0..<arr.count {
str = str.replacingOccurrences(of: arr[i], with: String(i))
}
return Int(str)!
}
replacingOccurrences 를 활용해 보다 손 쉽게 코드를 구성한 점이 눈이 띈다.
s의 값을 0부터 arr 갯수 만큼 순회해 arr[i] 값에 해당하는 내용을 String(i)로 변환한다. 그 이후 다시 Int를 씌워 리턴하면 풀이 완료
replacingOccurrences 란 무엇인가
Swift에서 문자열을 다룰때 특정 부분을 다른 문자열로 대체할때 사용된다. replacingOccurrences 메서드는 문자열 내 특정 부분을 다른 문자열로 대체하여 새로운 문자열을 반환하는데 사용된다.
let originalString = "Hello, World! Hello, Swift!"
let newString = originalString.replacingOccurrences(of: "Hello", with: "Hi")
print(newString) // 출력: "Hi, World! Hi, Swift!"
위 예시는 Hello 문자열을 Hi 로 대체하여 새로운 문자열을 뽑아냈다. 이런 식으로 사용되는 점을 숙지하자.
뿐 만 아니라 옵션을 사용해 대소문자 구분 여부 등도 알 수 있다.
func replacingOccurrences(of target: String, with replacement: String, options: String.CompareOptions = [], range searchRange: Range<String.Index>? = nil) -> String
replacingOccurrences 메서드는 원본 문자열을 변경하는 것이 아니라 새로운 문자열을 반환한다는 것을 잊지 말자!
'◽️ Programming > ◽️ Algorithm' 카테고리의 다른 글
삼총사 (0) | 2024.04.16 |
---|---|
문자열 다루기 기본 (0) | 2024.03.25 |
부족한 금액 계산하기 (0) | 2024.03.22 |
문자열 내림차순으로 정렬하기 (0) | 2024.03.20 |
약수의 개수와 합계 (2) | 2024.03.19 |