-
카테고리
-
세부 분야
알고리즘 · 자료구조
-
해결 여부
미해결
LongestSubString 문제 질문 !
20.05.14 19:50 작성 조회수 149
1
Map<Character, Integer> map = new HashMap<Character, Integer>();
while (end < s.length()) {
char endChar = s.charAt(end);
map.put(endChar, map.getOrDefault(endChar, 0) + 1);
if (map.get(endChar) == 1) {
counter++;
}
end++;
while (counter > 2) {
char startChar = s.charAt(start);
map.put(startChar, map.get(startChar)-1);
}
}
여기 부분이 잘 이해가 가지않습니다. getOrDefault메서드를 처음봐서 예제와 검색을 통해 익혀보려했는데 이해가 되지않네요 ㅠ ㅠ 모호한 질문입니다만...
map을 사용하신 생각의 근거? 도 궁금하고
map.put(endChar, map.getOrDefault(endChar, 0) + 1); 이부분을 한국말로 말하실때와
map.put(startChar, map.get(startChar)-1); 이부분이 궁금합니다 강의를 몇번 돌려봤지만 제 지식의 수준으로
잘 안되네요 감사하고 죄송합니다!!
답변을 작성해보세요.
2
푸샵맨 코딩스터디
지식공유자2020.05.15
안녕하세요.
질문주신
1. 여기 부분이 잘 이해가 가지않습니다. getOrDefault메서드를 처음봐서 예제와 검색을 통해 익혀보려했는데 이해가 되지않네요 ㅠ ㅠ 모호한 질문입니다만...
=>
제 github 주소에, 01_Basic 폴더 내 MapTest.java
예제를 올려놨습니다.
//1 일반적인 방법
for(String str : arr) {
if(map.containsKey(str)){
map.put(str, map.get(str)+1);
}else {
map.put(str, 1);
}
}
//2 getOrDefault 를 이용한 방법
for(String a : arr)
map.put(a, map.getOrDefault(a, 0) + 1);
1번처럼 하면 너무 귀찮아서 , getOrDefault를 만든거여여 한줄로 끝내버립니다.
비교해서 보시면 쉽게 이해가 되실겁니다.
맵에 키가 있는지 체크해서 없으면 넣고, 있으면 value+1을 하는거죠, getOrDefault가 이해하기 힘들면
1번으로 한 부분으로 바꾸면서 테스트해보세요, 한국말로 연습하시면됩니다.
이렇게 "우리는 맵에 {키,밸루}를 넣어야 하는데 처음에 c가 들어오면 기존 맵에 있는지 체크하고 없으면 put을 하는데
{c, 1}로 맵에 넣는다 , 근데 그다음에 또 c가 들어왔네 그럼 이미 있으니까 +1을 밸루에 더해서 넣는다 "
우리는 이짓(?)을 해서 초보 딱지를 뗄 수 있습니다. 누구도 처음부터 먼저 안 사람 없습니다. 님처럼 간절히 연습하시면 나중에
큰 보답이 있을거라고 전 확신합니다.
혹시 누가 막 코딩을 겁나 잘한다 난 이게 뭔가 이렇게 비교하지마시고요. 이문제를 한국말로 완벽히 해보고 코딩으로 된것도 한국말로 적어보세요. 이런 문제가 연습하기 딱 좋습니다.^^;
2. 질문주신
map.put(endChar, map.getOrDefault(endChar, 0) + 1); 이부분을 한국말로 말하실때와map.put(startChar, map.get(startChar)-1); 이부분이 궁금합니다 강의를 몇번 돌려봤지만 제 지식의 수준으로
잘 안되네요 감사하고 죄송합니다!!
=>
제가 한국말로 적어보고 , 아래 코딩이 내가 생각한 한국말로 표현되는지 다 적어보겠습니다.
문제를 완전히 이해하셨다는 가정하에,
한국말로 하면 "ccaa는 문자길이가4개, aabbb는 문자길이가 5개니까 우리는 5개를 구해야합니다.
ccaa가 4개인걸 인식한 후 ccaab로 진행중 b가 들어오는 순간 문자 unique갯수가 3개 된다
그때 우리는 c를 없앨수가 있다. c를 없애고 a부터해서 aabbb를 세기 시작해서 갯수 5가 나오면 최대값 비교해서 5 "
헷갈린다고 하신 부분은 처음에 c를 없애고 aabbb로 카운트하는 부분입니다.
그걸 명심하시고 보시면됩니다.
그럼 위에 한국말을 자바로 해볼게요
while(counter > 2){
counter 가 3개 되는순간 위에 한국말 (ccaab로 진행중 b가 들어오는 순간 문자 unique갯수가 3개 된다)
char startChar = s.charAt(start);
그걸 꺼내본다 . startChar 는 c , 왜냐면
(ccaab로 진행중 b가 들어오는 순간 문자 unique갯수가 3개 되고, 문제에서 주어진 2개 이상이 됐기때문에 맨앞c를 제거해야됩니다.)
map.put(startChar, map.get(startChar) - 1);
지금 맵에 등록된 c의 갯수 하나를 날린다. 왜냐면
(c를 없애고 a부터해서 aabbb를 세기 위해서, 여기서 처음에 c:2개 였는데 c가 1개로 됨)
if(map.get(startChar) == 0){
지금 맵에 등록된 c의 갯수가 0이 될때까지 진행해야한다.
c를 카운트하지 않기위해서(c를 없애고 a부터해서 aabbb를 세기 시작해서)
counter--;
c의 갯수가 0이되면 C를 빼버리고( a부터해서 aabbb를 세기 시작)
}
start++;
ccaa 인덱스가 두번째 c로 넘어간다.
}
len = Math.max(len, end-start);
글로 쓰니까 너무 복잡하게됐는데 , 강의를 추후 업데이트 하겠습니다.
이런류의 문제는 수없이 응용이 가능합니다. 그런 문제를 다 풀어 볼순 없죠
딱하나, 한국말로 정확히 이해하고 그 플로우를 자바 언어로만 표시만 하면됩니다.
규칙데로, 1. 담을 밥그릇 정하기, 2.알고리즘 정해서 빼기 3,for. while문 돌리면서 빼내기
어떤 문제가 나와도 적용가능합니다.
푸샵맨 코딩스터디~
답변 1