-
카테고리
-
세부 분야
알고리즘 · 자료구조
-
해결 여부
미해결
추가 질문드립니다.
19.10.22 23:56 작성 조회수 74
3
안녕하세요!
강의 듣던 중에 하나 질문이 드리고자 합니다.
강의 막바지에, char을 sorting하는 방법이 이제 배열 256개를 만들어 아스키코드를 활용하신다고 잠깐 언급해주셨는데요,
혹시 이에 대한 코드를 알려주실 수 있나요?
하나의 문제에 여러가지로 접근하는 것이 도움이 많이 되는듯하네요!
항상 감사드립니당!!
답변을 작성해보세요.
6
푸샵맨 코딩스터디
지식공유자2019.10.24
네 안녕하세요
좋은 질문 감사합니다
이문제는 비슷한 유형으로 시험에 많이 나옵니다. 이문제의 핵심은
//1. 모든 값을 빼낸다
for (String str : strs) {
//2 char[] 어레이로 담는다
char[] charArray = str.toCharArray();
//3. 소팅한다 -> 알파벳순으로 되겠죠
Arrays.sort(charArray); eat나 ate aet로 되죠
//4. 소팅한 순서가 키가 된다
String key = String.valueOf(charArray);
// 5. map 처리
if (map.containsKey(key)) {
map.get(key).add(str);
} else {
List<String> list = new ArrayList<>();
list.add(str);
map.put(key, list);
}
}
질문주신 내용이
"배열 256개를 만들어 아스키코드를 활용하신다고 잠깐 언급해주셨는데요,"
질문주신 내용중 아래 부분만 변경 할수 있죠
=> 배열 26개짜리 방을 만들어서 알파벳을 다 저장할 공간을 만듭니다. 256개는 아스키 자체값을 이용할때 쓰는데
요새 코딩패턴은 26개로 만들어서 'a'를 빼주는 식입니다.
예를들어 eat 단어가 들어오면 , e-a , a-a, t-a 이런식으로 a아스키값 97을 빼면 되죠
e-a는 101-97=4번방에 값에 1을 넣고
a-a는 97-97=0번방에 값에 1을 넣고
t-a는 116-97=19번방에 값에 1을 넣고
그러면 배열방에 [1,0,0,0,1,0,0,0,...] 이런식으로 1이 셋팅됩니다. 결국 eat 나 ate나 0,4,19번 방에 값이 같은거죠
이 방법을 요새는 상당히 많이 이용합니다. 외우세요^^
코드로 보면
for (String str : strs) {
// 1. 26개 배열방을 만든다
int[] count = new int[26];
//2. 스트링 값을 뺀다. 이때 아스키값 a 97을 이용해서 위에서 설명한 내용처럼 26개 인덱스중에 1을 셋팅한다
for (int k = 0; k < str.length(); k++)
count[str.charAt(k) - 'a']++;
// 3. 그 자체를 스트링으로 변환한다.
String key = Arrays.toString(count);
System.out.println("hash " + key);
//4 map에서 처리한다
if (map.containsKey(key)) {
map.get(key).add(str);
} else {
List<String> list = new ArrayList<>();
list.add(str);
map.put(key, list);
}
}
답변 1