Light Blue Pointer
본문 바로가기
Coding Test

[프로그래머스]숫자 문자열과 영단어

by 개발바닥곰발바닥!!! 2023. 11. 23.

문제 주소

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명

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

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

  • 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에는 영단어로 바뀐 부분이 없습니다.

제한시간 안내

정확성 테스트 : 10초

풀이 과정

⭐Java Hashmap

import java.util.HashMap; // import the HashMap class

HashMap<String, String> capitalCities = new HashMap<String, String>();
// Add keys and values (Country, City)
    capitalCities.put("England", "London");

capitalCities.get("England");

capitalCities.remove("England");

capitalCities.clear();
import java.util.HashMap;
class Solution {
    public int solution(String s) {
        HashMap<String, int> numbers = new HashMap<String, int>();
        numbers.put("zero",0);
        numbers.put("one",1);
        numbers.put("two",2);
        numbers.put("three",3);
        numbers.put("four",4);
        numbers.put("five",5);
        numbers.put("six",6);
        numbers.put("seven",7);
        numbers.put("eight",8);
        numbers.put("nine",9);
            
        String answer = "";
        String number = "";
        boolean isChar = false;
        for(int i=0; i<s.length() ; i++){
            char c = s.charAt(i);

            if((""+c).matches("[0-9]")){
                if(isChar){
                    answer += numbers.get(number);
                    isChar = false;
                    number = "";
                }
                answer += c;
            }else{
                isChar = true;
                number += c;
            }  
        }
        if(!numbers.equals("")){
            answer += numbers.get(number);
        }
        return Integer.parseInt(answer);
    }
}

/Solution.java:4: error: unexpected type

HashMap<String, int> numbers = new HashMap<String, int>();

^

required: reference

found: int

/Solution.java:4: error: unexpected type

HashMap<String, int> numbers = new HashMap<String, int>();

^

required: reference

found: int

2 errors

import java.util.HashMap;
class Solution {
    public int solution(String s) {
        HashMap<String, Integer> numbers = new HashMap<String, Integer>();
        numbers.put("zero",0);
        numbers.put("one",1);
        numbers.put("two",2);
        numbers.put("three",3);
        numbers.put("four",4);
        numbers.put("five",5);
        numbers.put("six",6);
        numbers.put("seven",7);
        numbers.put("eight",8);
        numbers.put("nine",9);
            
        String answer = "";
        String number = "";
        boolean isChar = false;
        for(int i=0; i<s.length() ; i++){
            char c = s.charAt(i);

            if((""+c).matches("[0-9]")){
                if(isChar){
                    answer += numbers.get(number);
                    isChar = false;
                    number = "";
                }
                answer += c;
            }else{
                isChar = true;
                number += c;
            }  
        }
        if(!numbers.equals("")){
            answer += numbers.get(number);
        }
        return Integer.parseInt(answer);
    }
}

Exception in thread "main" java.lang.NumberFormatException: For input string: "2345null"

at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)

null이 왜들어갔을까

"23four5six7" 234567
"2three45sixseven" 234567

테스트케이스 둘중의 하나가 잘못됐겠지

왠지 sixseven일 거 같음 ㅋㅋ

아 내가 문자 다음에 바로 숫자가 오는 경우만 생각해서 짜고 문자가 두번 나오는 경우는 안 짰네….

한 char한 char읽으면서 같은거 있는지 대조하기

혹은

split해서 줄어든 String 크기 비교해서 그만큼 저 숫자로 대치하기 ㅋㅋ는 못 써… 순서가 중요해서….

⭐java string pattern matching

You can use the Pattern class for this. If you want to match only word characters inside the {} then you can use the following regex. \\w is a shorthand for [a-zA-Z0-9_]. If you are ok with _ then use \\w or else use [a-zA-Z0-9].

String URL = "<https://localhost:8080/sbs/01.00/sip/dreamworks/v/01.00/cui/print/$fwVer/{$fwVer}/$lang/en/$model/{$model}/$region/us/$imageBg/{$imageBg}/$imageH/{$imageH}/$imageSz/{$imageSz}/$imageW/{$imageW}/movie/Kung_Fu_Panda_two/categories/3D_Pix/item/{item}/_back/2?$uniqueID={$uniqueID}>";
Pattern pattern = Pattern.compile("/\\\\{\\\\w+\\\\}/");
Matcher matcher = pattern.matcher(URL);
if (matcher.find()) {
    System.out.println(matcher.group(0)); //prints /{item}/
} else {
    System.out.println("Match not found");
}

That's just a matter of [String.contains](<http://download.oracle.com/javase/7/docs/api/java/lang/String.html#contains%28java.lang.CharSequence%29>):

if (input.contains("{item}"))

If you need to know where it occurs, you can use indexOf:

int index = input.indexOf("{item}");
if (index != -1) // -1 means "not found"
{
    ...
}

That's fine for matching exact strings - if you need real patterns (e.g. "three digits followed by at most 2 letters A-C") then you should look into regular expressions.

EDIT: Okay, it sounds like you do want regular expressions. You might want something like this:

private static final Pattern URL_PATTERN =
    Pattern.compile("/\\\\{[a-zA-Z0-9]+\\\\}/");

...

if (URL_PATTERN.matcher(input).find())

으악 그냥 char 이 true일때마다 matches로 체크하는게 케이스분리 더 간편한듯

제출 코드

class Solution {
    public int solution(String s) {
       
        String answer = "";
        String number = "";
        for(int i=0; i<s.length() ; i++){
            char c = s.charAt(i);

            if((""+c).matches("[0-9]")){
                answer += c;
            }else{
                number += c;
                if(number.equals("zero")){
                    answer += 0;
                    number = "";
                }else if(number.equals("one")){
                    answer += 1;
                    number = "";
                }else if(number.equals("two")){
                    answer += 2;
                    number = "";
                }else if(number.equals("three")){
                    answer += 3;
                    number = "";
                }else if(number.equals("four")){
                    answer += 4;
                    number = "";
                }else if(number.equals("five")){
                    answer += 5;
                    number = "";
                }else if(number.equals("six")){
                    answer += 6;
                    number = "";
                }else if(number.equals("seven")){
                    answer += 7;
                    number = "";
                }else if(number.equals("eight")){
                    answer += 8;
                    number = "";
                }else if(number.equals("nine")){
                    answer += 9;
                    number = "";
                } 
            }  
        }
        return Integer.parseInt(answer);
    }
}

노가다했다..!