• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

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); 이부분이 궁금합니다 강의를 몇번 돌려봤지만 제 지식의 수준으로 

잘 안되네요 감사하고 죄송합니다!!

답변 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문 돌리면서 빼내기

어떤 문제가 나와도 적용가능합니다.

푸샵맨 코딩스터디~