[JAVA] 프로그래머스 - [3차]압축

2023. 5. 3. 01:48· 알고리즘/프로그래머스
 

프로그래머스

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

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
'알고리즘/프로그래머스' 카테고리의 다른 글
  • [JAVA] 프로그래머스 - 거스름돈
  • [JAVA] 프로그래머스 - 튜플
  • [JAVA] 프로그래머스 - [1차] 캐시
  • [JAVA] 프로그래머스 - 귤 고르기
하얀 돌덩이
하얀 돌덩이
하얀 돌덩이
돌덩이
하얀 돌덩이
전체
오늘
어제
  • 분류 전체보기 (59)
    • 개발 일지 (2)
    • 스프링 (1)
    • JAVA (2)
    • 딥러닝 (10)
    • 알고리즘 (43)
      • 개념 (4)
      • 프로그래머스 (5)
      • 백준 (34)
    • 후기 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
하얀 돌덩이
[JAVA] 프로그래머스 - [3차]압축
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.