안녕하세요! delay100입니다.
토요일에도 역시 문제를 출제해주셔서 문제를 풀어보았습니다.
미들러 문제.
숫자 문자열과 영단어 (https://school.programmers.co.kr/learn/courses/30/lessons/81301)
먼저 String s 에서 현재 문자가 알파벳인지, 숫자인지를 파악해야합니다.
그런데 첫 글자만 비교하기엔 two, three와 four, five를 봤을 때 중복이 발생합니다.
따라서 두 글자씩 끊으면 tw, th / fo, fi가 되어 중복이 발생하지 않게 됩니다.
중복이 발생하지 않으면 각 값을 key로 이용할 수 있습니다.
또한 plusIndex를 만들어준 이유는 key값을 두 글자씩 끊어서 생각하기 때문입니다.
String s를 순환할 때 알파벳인 경우 "해당 알파벳 길이 -1" 만큼 index를 이동해주어야 합니다.
예를들어, String s가 "zero1" 경우 현재 index가 0, zero를 확인하고 다음 1로 이동해야하므로 index를 3만큼 추가해야합니다.
왜 4만큼 가지 않냐면, 문자열을 확인할 때 for문이 실행될 때마다 +1을 하기 때문에 +3을 해야 그 다음 i++에 의해 1에 도달할 수 있게 됩니다.
즉, 아래의 표를 생각해 내는 것이 핵심입니다.
key | value | plusIndex
ze, 0, 3
on, 1, 1
tw, 2, 1
th, 3, 4
fo, 4, 3
...
풀이방식은 Node 클래스를 만들어 "0~9"와 "각 알파벳 길이-1" 정보를 묶어두었습니다.
그리고 main에서 map을 만들어 key + (value, plusIndex)를 묶어주었습니다.
import java.io.*;
import java.util.*;
class Node {
int value; // 0~9를 표시
int plusIndex; // 각 "알파벳 길이 - 1" 값, 알파벳의 첫 자리에 들어왔을 때 추가해줄 크기입니다. 추후 사용할 반복문에서 for문이 실행될 때 i 값이 1씩 증가하므로 -1을 해주어야 index 에러가 나지 않습니다.
Node(int value, int plusIndex) {
this.value = value;
this.plusIndex = plusIndex;
}
int getValue() {
return this.value;
}
int getPlusIndex() {
return this.plusIndex;
}
}
class Solution {
public int solution(String s) {
StringBuilder sb = new StringBuilder();
Map<String, Node> map = new HashMap<>(); // map을 만들어줍니다. key(알파벳 앞 2자리), Node(알파벳 관련 설정)
map.put("ze", new Node(0, 3));
map.put("on", new Node(1, 2));
map.put("tw", new Node(2, 2));
map.put("th", new Node(3, 4));
map.put("fo", new Node(4, 3));
map.put("fi", new Node(5, 3));
map.put("si", new Node(6, 2));
map.put("se", new Node(7, 4));
map.put("ei", new Node(8, 4));
map.put("ni", new Node(9, 3));
for(int i=0; i<s.length(); i++) {
if(s.charAt(i)>=97 && s.charAt(i)<=122) { // 문자인 경우
String subS = s.substring(i, i+2); // 첫 번째 자리 문자와 두 번째 자리 문자를 문자열로 꺼내옴
sb.append(map.get(subS).getValue()); // 출력 값에 추가함
i += map.get(subS).getPlusIndex(); // 알파벳 길이-1 만큼 현재 index를 조정해줌
} else { // 숫자인 경우
sb.append(s.charAt(i)-'0');
}
}
int answer = Integer.parseInt(sb.toString()); // 문자열을 숫자로 변환해 출력 타입을 int로 변경
return answer;
}
}
+ 비기너 문제
문자열을 정수로 바꾸기 (https://school.programmers.co.kr/learn/courses/30/lessons/12925)
+ 챌린저 문제
삼각 달팽이 (https://school.programmers.co.kr/learn/courses/30/lessons/68645)
봐주셔서 감사합니다!
'항해99 > 99club1기TIL' 카테고리의 다른 글
[99club/TIL] 2주차 - 월요일 TIL(Today I Learned) (0) | 2024.04.01 |
---|---|
[99club/TIL] 1주차 - 일요일 TIL(Today I Learned) (0) | 2024.03.31 |
[99club/TIL] 1주차 - 금요일 TIL(Today I Learned) (0) | 2024.03.30 |
[99club/TIL] 1주차 - 목요일 TIL(Today I Learned) (0) | 2024.03.28 |
[99club/TIL] 1주차 - 화요일 TIL(Today I Learned) (1) | 2024.03.26 |