문제: https://school.programmers.co.kr/learn/courses/30/lessons/17684
1. 코드
import java.util.*;
class Solution {
public List<Integer> solution(String msg) {
List <Integer> list = new ArrayList<>();
Map <String, Integer> map = new HashMap<>();
int index = 1;
for(char c = 'A'; c <= 'Z'; c++)
map.put(String.valueOf(c), index++);
int len = 0;
for(int i = 0; i < msg.length(); i = len - 1) {
boolean check = false;
for(int j = i + 1; j <= msg.length(); j++) {
len = j;
if(!map.containsKey(msg.substring(i, j))) {
check = true;
break;
}
}
if(!check)
list.add(map.get(msg.substring(i, len)));
else
list.add(map.get(msg.substring(i, len - 1)));
map.put(msg.substring(i, len), index++);
if(len == msg.length() && !check)
break;
}
return list;
}
}
2. 설명
List <Integer> list = new ArrayList<>();
Map <String, Integer> map = new HashMap<>();
int index = 1;
for(char c = 'A'; c <= 'Z'; c++)
map.put(String.valueOf(c), index++);
우선 HashMap에 'A'부터 'Z'까지 1부터 순서대로 저장합니다.
int len = 0;
for(int i = 0; i < msg.length(); i = len - 1) {
boolean check = false;
for(int j = i + 1; j <= msg.length(); j++) {
len = j;
if(!map.containsKey(msg.substring(i, j))) {
check = true;
break;
}
}
반복분을 통해서 HashMap에 이미 저장된 문장여부를 확인하여 문자열의 길이를 늘려가는데 만약 HashMap에 존재하지 않으면 check를 통해서 존재여부를 알려줍니다. 그리고 반복문을 중지합니다.
if(!check)
list.add(map.get(msg.substring(i, len)));
else
list.add(map.get(msg.substring(i, len - 1)));
map.put(msg.substring(i, len), index++);
if(len == msg.length() && !check)
break;
}
return list;
만약 찾지 못했다면 i부터 len까지의 길이의 msg 문자열을 사전에서 찾아 List에 저장합니다. 아니라면 i부터 len - 1까지의 길이를 저장합니다. Map에는 이미 저장된 순서대로 저장합니다.
만약 len의 길이가 msg의 길이와 동일한데 Map에 문자열이 존재하지 않는다면 마지막을 의미하기에 반복문을 종료한 뒤 list를 반환하면 됩니다.
3. 정리
- 마지막 확인 여부만 신경쓰면 쉽게 해결 가능하다.
- List와 Map을 적절히 활용하자.
출처: 프로그래머스 코딩 테스트 연습,
https://school.programmers.co.kr/learn/challenges
'컴퓨터 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 12927번: 야근 지수 [Java] (0) | 2023.10.27 |
---|---|
프로그래머스 - 12938번: 최고의 집합 [Java] 실패 (0) | 2023.10.26 |
프로그래머스 - 43162번: 네트워크 [Java] (0) | 2023.10.24 |
프로그래머스 - 92335번: k진수에서 소수 개수 구하기 [Java] (0) | 2023.10.23 |
프로그래머스 - 42577번: 전화번호 목록 [Java] (0) | 2023.10.22 |