오돌
99클럽 코테 스터디 4일차 TIL - 숫자 문자열과 영단어 본문
오늘의 문제
프로그래머스 - 숫자 문자열과 영단어
코딩테스트 연습 - 숫자 문자열과 영단어 | 프로그래머스 스쿨
문제내용과 풀이
문제 설명
네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다. 다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
1478 → "one4seveneight" 234567 → "23four5six7" 10203 → "1zerotwozero3" 이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ s의 길이 ≤ 50
- s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
- return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.
입출력 예
"one4seveneight" - 1478
"23four5six7" - 234567
"2three45sixseven" - 234567
"123" - 123
문제를 풀기 전 힌트를 볼 수 있는데 힌트가 문자열/해시 였다.
다양한 방법이 있겠지만, hash map이 바로 떠올라서 이를 활용해 풀어야겠다고 생각했다.
회사에서는 보통 db값을 hashmap에 담고, view로 넘겨서, 가공해서 뿌리기만 했지 자바 메서드는 put,get 말고는 딱히 안 써봤어서 막막하긴 했다. 자바에서 map에 대해 for문도 잘 안돌려봤었다. 해서 hashmap에 대해 좀 알아보기로 했다.
우선 map은 자바의 인터페이스이며, 키-값 쌍으로 데이터를 저장하고 관리한다.
map을 사용한 모든 클래스들은 모두 고유 키를 사용해 값에 접근할 수 있고, 같은 키로 여러 값을 저장할 수 없다.
hashmap은 키 - 값 쌍을 해싱해서 저장하며, 순서를 보장하지 않는다.(LinkedHashMap 은 보장)
해싱은, 키-값 자체가 해싱되는게 아니라, 키를 해싱해서 해시코드(정수)를 만들고, 그 코드로 특정 위치를 결정한다고 한다.
때문에 키를 이용한 값 검색에서 시간복잡도 O(1) 에 가까운 성능을 가져 속도가 매우 빠르다고 한다.
map의 주요메서드로는
- put(K key, V value): 키와 값을 맵에 추가한다.
- get(Object key): 지정된 키에 매핑된 값을 반환한다.
- remove(Object key): 지정된 키의 항목을 제거한다.
- containsKey(Object key): 특정 키가 있는지 확인한다.
- containsValue(Object value): 특정 값이 있는지 확인한다.
- size(): 저장된 키-값 쌍의 개수를 반환한다.
map의 주요 반복문 메서드로는
- entrySet(Object key): key와 value 쌍을 모두 조회할 때 사용한다.
- keySet (Object value): key만 조회한다. get으로 value를 가져올 수 있다.
- values (): 모든 value만 조회한다.
가 있었다. 여기서 keySet을 활용해서, 단어(key)로 숫자(value)를 찾아 반환할 수 있을거라고 생각했다.
1. 내 풀이
import java.util.HashMap;
class Solution {
public int solution(String s) {
HashMap<String, String> map = new HashMap<>();
map.put("zero", "0");
map.put("one", "1");
map.put("two", "2");
map.put("three", "3");
map.put("four", "4");
map.put("five", "5");
map.put("six", "6");
map.put("seven", "7");
map.put("eight", "8");
map.put("nine", "9");
for(String word : map.keySet()) {
if(s.contains(word)){
s = s.replace(word, map.get(word));
}
}
int result = Integer.parseInt(s);
return result;
}
}
우선 문자, 숫자 쌍을 key-value로 hashmap에 각각 넣고, map을 for문돌리고 그 for문에서 string을 계속 대입했다.
keySet을 통해 zero ~ nine 까지 돌게 되는데, String에서 contain 할 때 마다 String의 그 부분이 바뀔 것이고, 대입을 안하고 s.replace만 하면 String은 불변이라 변하지 않기 때문에 그 때마다 대입해주면 for문이 끝날 때 결국String에 있는 문자열이 바뀌는 식으로 해결했다.. !
1. 다른 풀이
class Solution {
public int solution(String s) {
String[] strArr = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
for(int i = 0; i < strArr.length; i++) {
s = s.replaceAll(strArr[i], Integer.toString(i));
}
return Integer.parseInt(s);
}
}
다른 풀이 대부분 저렇게 배열로 담아서 해결한 사람이 많았다. 아마 내가 힌트를 보지 않았다면 나도 hashmap을 쓰지 않았을 것 같긴 하다. replaceAll을 왜 썼는지 궁금해서 알아보니까, replace도 상관 없었다.
replace는 첫번째 인자로 단순 문자열로 처리하고, replaceAll은 첫번째 인자를 정규식으로 처리한다고 한다.
오늘 문제로 평소 아무생각없이 쓰던 hashmap에 대해 좀 더 알 수 있었다..!
'코테' 카테고리의 다른 글
99클럽 코테 스터디 10일차 TIL - 폰켓몬 (5) | 2024.11.07 |
---|---|
99클럽 코테 스터디 6일차 TIL - 할리갈리 (0) | 2024.11.02 |
99클럽 코테 스터디 3일차 TIL - 문자열 나누기 (0) | 2024.10.30 |
99클럽 코테 스터디 2일차 TIL - 크기가 작은 부분문자열 (0) | 2024.10.29 |
99클럽 코테 스터디 1일차 TIL - 문자열 내 p와 y의 개수 (0) | 2024.10.28 |