프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
의식의 흐름
일단 A, B, C,...에 대해서 색인 번호를 줘야하니까 HashMap을 써야겠다고 생각했다. 나중에 영문자에 따라 색인 번호를 answer에 넣어주어야 하므로 HashMap의 key는 String(영단어), value는 Integer(색인 번호)로 설정했다. msg의 어디까지 체크했는지 알 수 있도록 checkIdx를 하나 두고 checkIdx가 msg 길이보다 같거나 커지면 map에 넣고 색인 번호 찾고 하는 작업들을 그만두면 되지 않을까?하고 생각한대로 코드를 짰는데 answer에 마지막 색인 번호를 못 넣거나 무한루프에 빠져서 한참 헤맸다,,,
알고보니 만약 map에 없는 단어일 경우, answer에 마지막 글자를 제외한 단어의 색인 번호 넣고 map에 해당 영문자에 대한 색인 번호를 넣어준 후 checkIdx를 증가시켰는데 마지막 글자만 남은 경우 해당 if문에 절대 안들어가서 마지막 문자 처리를 못했던 것이었다..! (ex) KAKAO => O는 무조건 map의 key값으로 존재하게 되기 때문에 if문에 안들어가게 되고 따라서 O를 answer에 넣지 못함) 그래서 answer에 답을 넣었는지 boolean값을 두고 false인 경우(answer에 들어갈 마지막 색인 번호에 해당하는 단어 넣어야하는 경우)를 처리하게 했다.
풀이
1. HashMap에 key(알파벳), value(색인 번호) 넣어준다.
2. msg의 모든 글자를 확인할 때까지 while문을 돌린다
-> map에 없는 단어면 해당 단어의 단어의 마지막 글자를 제외한 부분의 색인 번호를 tempAnswers에 넣어주고 map에 단어와 색인 번호와 함께 저장한다.
-> 만약 for문에서 msg의 모든 글자를 확인했는데 tempAnswers에 아무것도 넣지 않았다면 마지막 단어만 남은 것이므 로 아직 tempAnswers에 색인 번호를 넣지 않은 단어의 색인 번호를 넣어준다.
3. tempAnswers의 요소들을 answer로 옮긴다.
코드
import java.util.*;
class Solution {
public int[] solution(String msg) {
int[] answer = {};
HashMap<String, Integer> map = new HashMap<>();
for(int i=0;i<26;i++){
map.put(Character.toString('A'+i),i+1); // 알파벳 별로 색인 번호 지정
}
int checkIdx = 0; // msg의 어디까지 체크했는지
ArrayList<Integer> tempAnswers = new ArrayList<>(); // answer에 들어갈 색인 번호들
while(checkIdx<msg.length()){
String checkString = ""; // 체크할 영단어
boolean isAdd2Answer = false; // tempAnswers에 색인 번호 넣었는지
for(int i=checkIdx;i<msg.length();i++){
Character tempChar = msg.charAt(i);
if(!map.containsKey(checkString+tempChar)){ // 만약에 map에 없는 단어면
tempAnswers.add(map.get(checkString));
map.put(checkString+tempChar,map.size()+1); // map에 추가 후 break
checkIdx += checkString.length();
isAdd2Answer = true;
break;
}
checkString += tempChar;
}
if(!isAdd2Answer){ // for문을 돌렸는데도 tempAnwers에 색인 번호 못 넣은 경우
tempAnswers.add(map.get(checkString));
checkIdx += checkString.length();
}
}
answer = new int[tempAnswers.size()];
for(int i=0;i<tempAnswers.size();i++)
answer[i] = tempAnswers.get(i); // tempAnswers에 넣어둔 색인 번호들 answer로 옮기기
return answer;
}
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[JAVA] 프로그래머스 - 거스름돈 (0) | 2023.11.23 |
---|---|
[JAVA] 프로그래머스 - 튜플 (0) | 2023.05.01 |
[JAVA] 프로그래머스 - [1차] 캐시 (0) | 2023.05.01 |
[JAVA] 프로그래머스 - 귤 고르기 (0) | 2023.05.01 |