항해 99클럽 코테

99클럽 코테 스터디 4일차 TIL

metamong-data 2024. 10. 31. 23:18
728x90
반응형

오늘의 학습 키워드

문자열/해시

과제

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.

다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.

  • 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. 입력으로 들어온 문자열의 최대 길이까지 while문으로 반복
  2. 현재 문자가 isdigit()를 이용하여 숫자인지 확인하고 숫자이면 그대로 answer에 추가
  3. 아닐 경우 number 딕셔너리의 각 키(key)를 순회
  4. 현재 위치부터 시작하는 부분 문자열이 해당 단어로 시작하는지 확인 후 단어가 있을 경우 answer에 추가

제출 코드 (python)

def solution(s):
    number = {"zero": "0", "one": "1", "two": "2", "three": "3", "four": "4", 
              "five": "5", "six": "6", "seven": "7", "eight": "8", "nine": "9"}
    answer = ""
    i = 0
    while i < len(s):
        if s[i].isdigit():
            answer += s[i]
            i += 1
            continue
        found = False
        for word in number:
            if s[i:].startswith(word):
                answer += number[word]
                i += len(word)
                found = True
                break

             
    return int(answer)

다른 언어로 문제 풀기

GO 언어

package main

import (
    "strings"
    "unicode"
)

func solution(s string) string {
    number := map[string]string{
        "zero": "0", "one": "1", "two": "2", "three": "3", "four": "4",
        "five": "5", "six": "6", "seven": "7", "eight": "8", "nine": "9",
    }
    
    var result strings.Builder
    for i := 0; i < len(s); {
        if unicode.IsDigit(rune(s[i])) {
            result.WriteByte(s[i])
            i++
            continue
        }
        
        found := false
        for word, num := range number {
            if strings.HasPrefix(s[i:], word) {
                result.WriteString(num)
                i += len(word)
                found = true
                break
            }
        }
        if !found {
            i++
        }
    }
    return result.String()
}

C++

#include <string>
#include <unordered_map>
using namespace std;

string solution(string s) {
    unordered_map<string, string> number = {
        {"zero", "0"}, {"one", "1"}, {"two", "2"}, {"three", "3"}, 
        {"four", "4"}, {"five", "5"}, {"six", "6"}, {"seven", "7"}, 
        {"eight", "8"}, {"nine", "9"}
    };
    
    string result = "";
    for(int i = 0; i < s.length();) {
        if(isdigit(s[i])) {
            result += s[i++];
            continue;
        }
        
        bool found = false;
        for(const auto& pair : number) {
            if(s.substr(i, pair.first.length()) == pair.first) {
                result += pair.second;
                i += pair.first.length();
                found = true;
                break;
            }
        }
        if(!found) i++;
    }
    return result;
}

오늘의 회고

  • 여러가지 언어를 이용해서 풀어보고, 이해하자!
  • isdigit()라는 메서드가 숫자인지 아닌지 판단하는 메서드라는 것을 처음 알았다!

출처 : https://school.programmers.co.kr/learn/courses/30/lessons/12916

 

728x90