네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
1478 → "one4seveneight"
234567 → "23four5six7"
10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.
class Solution { fun solution(s: String): Int { var answer: Int = 0 var tempForWord: String = "" var tempResult: String = "" val numberWord = mapOf( "zero" to 0, "one" to 1, "two" to 2, "three" to 3, "four" to 4, "five" to 5, "six" to 6, "seven" to 7, "eight" to 8, "nine" to 9 ) s.forEach { if (it.isDigit()) { //문자가 숫자인지 판단 tempResult += it //숫자가 계산되지 않도록 string 형태로 임시 결과 저장 } else { //단어인 경우 tempForWord += it //단어를 임시로 저장 val word = numberWord.keys.firstOrNull { tempForWord.startsWith(it) } //어떤 단어로 시작하는지 확인 if (word != null) { //맵에 단어가 있다면(null이 아니라면) tempResult += numberWord[word].toString() //임시 결과에 저장 tempForWord = "" //다시 for문을 돌아야 하므로 위해 초기화 } } } answer = tempResult.toInt() return answer } }
- .firstOrNull { } : 컬렉션에서 첫 번째 요소를 반환하거나 조건을 만족하는 첫 번째 요소를 반환하는 함수이다. 만족하지 않으면 null을 반환한다.
- .startsWith() : 문자열이 주어진 접두사로 시작하는지 여부를 검사하는 함수이다.
- 만약 one4를 s에 넣는다면, 첫 번째 if문을 돌면서 'o' 'e' 'n' 이린식으로 데이터를 tempForWord에 쌓게 되고, "one"이 되면 두 번째 if 문에서 더 이상 null이 아니게 된다(numberWord 안에 "one"이 존재하기 때문). 그럼 임시 결과 변수에 해당 word에 대응하는 value를 찾아 저장한다.
class Solution { fun solution(s: String): Int = s .replace("one", "1") .replace("two", "2") .replace("three", "3") .replace("four", "4") .replace("five", "5") .replace("six", "6") .replace("seven", "7") .replace("eight", "8") .replace("nine", "9") .replace("zero", "0") .toInt() }
- replace() : 문자열에서 특정 패턴을 다른 문자열로 대체한다.
[TIL-240229]
오늘 알고리즘 코드 팀 리뷰가 처음이었는데 앞으로도 많은 도움이 될 것 같습니다.