LongestSubString 문제 질문 !
206
작성한 질문수 9
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); 이부분이 궁금합니다 강의를 몇번 돌려봤지만 제 지식의 수준으로
잘 안되네요 감사하고 죄송합니다!!
답변 1
2
안녕하세요.
질문주신
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문 돌리면서 빼내기
어떤 문제가 나와도 적용가능합니다.
푸샵맨 코딩스터디~
강의자료에 나오는 m과 n의 범위가 코딩하고 다른거 같습니다
0
255
0
나선형매트릭스 깃허브에 코드가 없는것같아요
0
210
0
로그 파일의 데이터 재정렬 코드가 깃허브에 없어요!
0
225
0
새로 생긴 기초강의 질문드려요
1
376
1
질문드립니다
1
220
1
Unique Paths Integer 질문입니다
0
220
1
subString 방법으로 문제 풀이 영상은 짤린건가요?
1
254
1
DFS 방식으로 푼 것이 맞나요?
0
310
2
질문드립니다~
0
197
1
left if문에 대해서
1
257
1
오타 인가요?
1
238
1
안녕하세요 강사님
1
190
1
질문 드립니다
0
173
2
Queue&Stack 문제해설집 문의
0
184
1
문제분석 로직 질문
1
231
1
시간 복잡도 문의드립니다.
1
233
1
시간복잡도 질문드립니다.
1
203
1
for-each 문 질문있습니다!
0
295
1
강의영상에서 사용된 로그 메소드가 궁금합니다.
2
282
2
강의자료 + 문제 이해 관련 질문입니다
1
279
3
강사님 오류맞나요?
1
208
1
강사님 시간 복잡도에 대해서 질문드립니다.
1
174
1
질문입니다.
1
203
1
문제에 대한 이해
1
314
1





