알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄
https://programmers.co.kr/learn/courses/30/lessons/81301
코딩테스트 연습 - 숫자 문자열과 영단어
네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다. 다음은 숫자의 일부 자
programmers.co.kr
Think🤔
영어로 one5seveneight이 들어오면 1578 을 반환한다.
문자열로 s가 들어온다.. 어떻게 반환하면 좋을까?
앞글자씩 따 보기도 하고, 글자 수의 패턴을 찾다가.. charAt으로 뽑으면 어떨까 해서 아스키코드표를 참고했다.숫자 0~9 까지는 48~57 번호이고 영단어는 소문자이므로 97~122 까지 A부터 오름차순이다.그럼 charAt의 값이 48~57 사이면 그냥 넣어주고 만약에 소문자 번호 라인에서 걸리면 그것을 판별한다.근데 판별을 어떻게 할까?one는 111,110,101 이렇게 나오는데.. 자칫하다가는 반복문을 돌렸을 때 null포인트 익셉션이 발생하기 마련이다..
0은 z(122)부터 시작1은 o(111)2,3 은 t(116)4,5 는 f(102)6,7은 s(115)8은 e(101)9는 n(110) 이렇게 시작한다.
그러면 두개씩 나오는 2,3 그리고 4,5 그리고 6,7을 처리해줘야 한다.
for문으로 짜면 i는 항상 1씩밖에 증가하지 않으므로 while문으로 작성한다.
두 개씩 나오는 구문을 처리할 때는
two와 three를 if문으로 작성한다고 예를 들자면,
t까지는 같으므로 두 번째 char가 w(119)이면 뒤를 안 봐도 된다 무조건 two이기 때문!
class Solution {
public int solution(String s) {
int size = s.length();
int i=0;
String tmp = "1";
while(i>size){
if(s.charAt(i) > 47 && s.charAt(i) < 58){
tmp+=s.charAt(i);
i++;
}else if(s.charAt(i) == 122){
tmp+="0";
i+=4;
}else if(s.charAt(i) == 111){
tmp+="1";
i+=3;
}else if(s.charAt(i) == 101){
tmp+="8";
i+=5;
}else if(s.charAt(i) == 110){
tmp+="9";
i+=4;
}else if(s.charAt(i) == 116){
if(s.charAt(i+1) == 119){ // w 119
tmp+="2";
i+=3;
}else{
tmp+="3";
i+=5;
}
}else if(s.charAt(i) == 102){
if(s.charAt(i+1) == 111){
tmp+="4";
i+=4;
}else{
tmp+="5";
i+=4;
}
}else if(s.charAt(i) == 115){
if(s.charAt(i+1) == 105){
tmp+="6";
i+=3;
}else{
tmp+="5";
i+=5;
}
}
}
int answer = Integer.parseInt(tmp);
return answer;
}
}
처음 작성한 코드이다.
String tmp = ""; 로 초기화하면 널 포인트 익셉션이 찍힌다.
이걸 작성하면서 while문을 들여다보니 부등호 방향이 틀렸다..
부등호 방향을 고쳐주고 실행헀는데 마지막 charAt비교하는 곳에서도 에러가 있었음 seven은 7인데
5를 넣어줘서 테스트 케이스에 맞지 않게 들어갔다.
Solution✍
class Solution {
public int solution(String s) {
int size = s.length();
int i=0;
String tmp = "";
while(i<size){
if(s.charAt(i) > 47 && s.charAt(i) < 58){
tmp+=s.charAt(i);
i++;
}else if(s.charAt(i) == 122){
tmp+="0";
i+=4;
}else if(s.charAt(i) == 111){
tmp+="1";
i+=3;
}else if(s.charAt(i) == 101){
tmp+="8";
i+=5;
}else if(s.charAt(i) == 110){
tmp+="9";
i+=4;
}else if(s.charAt(i) == 116){
if(s.charAt(i+1) == 119){ // w 119
tmp+="2";
i+=3;
}else{
tmp+="3";
i+=5;
}
}else if(s.charAt(i) == 102){
if(s.charAt(i+1) == 111){
tmp+="4";
i+=4;
}else{
tmp+="5";
i+=4;
}
}else if(s.charAt(i) == 115){
if(s.charAt(i+1) == 105){
tmp+="6";
i+=3;
}else{
tmp+="7";
i+=5;
}
}
}
int answer = Integer.parseInt(tmp);
return answer;
}
}
replaceAll을 이용해서 문자를 치환해주는 메서드가 있었다..
왜 생각하지 못했을까 .. 흑 엄청 간단하게 짤 수 있었다 한번 만들어 보도록 하자..
class Solution {
public int solution(String s) {
s = s.replaceAll("zero","0");
s = s.replaceAll("one","1");
s = s.replaceAll("two","2");
s = s.replaceAll("three","3");
s = s.replaceAll("four","4");
s = s.replaceAll("five","5");
s = s.replaceAll("six","6");
s = s.replaceAll("seven","7");
s = s.replaceAll("eight","8");
s = s.replaceAll("nine","9");
int answer = Integer.parseInt(s);
return answer;
}
}
Review🤩
while문의 중요성을 알았고, 문제를 풀려고 먼저 노트에 작성하는 것이 좋다는 것을 느꼈다.
replace,replaceAll 을 기억하자..!
'Algorithm' 카테고리의 다른 글
[프로그래머스] 위클리 챌린지 4주차 (0) | 2021.09.02 |
---|---|
[리트코드] 965. Univalued Binary Tree (0) | 2021.09.01 |
[프로그래머스] 모의고사 (0) | 2021.08.31 |
[리트코드] 993. Cousins in Binary Tree (0) | 2021.08.30 |
[리트코드] 1071. Greatest Common Divisor of Strings (0) | 2021.08.20 |