inflearn logo
강의

Course

Instructor

Coding Test Practice Test (with C++): For Large Companies

2. Explanation of code for removing duplicate characters (Hash map)

중복된 문자 제거 코드

215

xogh7532

13 asked

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

c++코드를 자바로 변형했는데, 해시맵 오류가 뜹니다.
잘못 변형한 곳이 어디인지 궁금합니다.

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] argvs) {
        Scanner sc = new Scanner(System.in);
        
        String s=sc.next();
        s=s.toUpperCase();
        LinkedList<Character> res = new LinkedList<>();
        
        HashMap<Character, Integer> map = new HashMap<>();
        for(char x : s.toCharArray()) {
        	map.put(x, map.getOrDefault(x, 0)+1);
        }
        
        for(char x : map.keySet()) {
        	System.out.println(x+": "+map.get(x));
        }
        HashMap<Character, Integer> ch = new HashMap<>();
        
        for(char x: s.toCharArray()) {
        	map.put(x, map.get(x)-1);
        	if(ch.get(x)==1) continue;
        	while(res.size()!=0 && res.peekLast()>x && map.get(res.peekLast())>0) {
        		ch.put(res.peekLast(),ch.get(res.peekLast()-1));
        		//if(ch.get(res.peekLast())==0) ch.remove(res.peekLast());
        		res.pollLast();
        	}
        	res.addLast(x);
        	ch.put(x, ch.get(x)+1);
        }
        for(int i=0; i<res.size(); i++) System.out.print(res.get(i));
    }
}

c++ 코딩-테스트

Answer 1

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다.

xogh7532님, 코드를 살펴본 결과 중복된 문자를 제거하는 로직에서 몇 가지 오류를 발견하였습니다.

  1. ch.get(x)==1 이 조건은 ch 맵에 x가 1인 경우 계속 넘어가는 로직인데, 처음 ch 맵에 값을 넣기 전에는 ch.get(x) 결과가 null이므로 NullPointerException을 발생시킬 수 있습니다. 따라서 if(ch.getOrDefault(x, 0) == 1) continue;로 변경하는 것이 좋습니다.

  2. ch.put(res.peekLast(),ch.get(res.peekLast()-1)); 이 부분은 개념적으로 오류가 있습니다. ch.get(res.peekLast()-1)CharacterInteger를 연산하는 것으로 논리적으로 맞지 않습니다. 목적을 정확히 파악하기 어렵지만, 만약 res.peekLast()의 횟수를 1 감소시키고자 한다면, 이 줄은 제거하고 ch.put(res.peekLast(), ch.get(res.peekLast()) - 1);로 바꾸어야 합니다.

  3. 주석 처리된 if(ch.get(res.peekLast())==0) ch.remove(res.peekLast());에 대하여, 사용하지 않는 키를 삭제하고자 한다면 해당 코드 위에 ch.put 문장을 수정 후 주석을 해제해도 됩니다.

  4. 마지막으로, 각 문자를 추가할 때 ch.put(x, ch.get(x)+1); 이 부분에서 ch.get(x)null일 수 있으므로 ch.put(x, ch.getOrDefault(x, 0) + 1);로 변경해야 합니다.

코드 수정 후 예시는 다음과 같습니다:

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] argvs) {
        Scanner sc = new Scanner(System.in);

        String s=sc.next();
        s=s.toUpperCase();
        LinkedList<Character> res = new LinkedList<>();

        HashMap<Character, Integer> map = new HashMap<>();
        for(char x : s.toCharArray()) {
        	map.put(x, map.getOrDefault(x, 0)+1);
        }

        for(char x : map.keySet()) {
        	System.out.println(x+": "+map.get(x));
        }
        HashMap<Character, Integer> ch = new HashMap<>();

        for(char x: s.toCharArray()) {
            map.put(x, map.get(x)-1);
            if(ch.getOrDefault(x, 0) == 1) continue;
            while(res.size() != 0 && res.peekLast() > x && map.get(res.peekLast()) > 0) {
                char last = res.peekLast();
                ch.put(last, ch.get(last) - 1);
                //if(ch.get(last) == 0) ch.remove(last);
                res.pollLast();
            }
            res.addLast(x);
            ch.put(x, ch.getOrDefault(x, 0) + 1);
        }
        for(int i=0; i<res.size(); i++) System.out.print(res.get(i));
    }
}

이 수정사항을 적용하면 해시맵 관련 오류를 해결할 수 있습니다.

바둑돌에 조합을 구하는 dfs는 설명이 어딨나요

0

96

1

알고리즘이라.. 강의 설명때 모식도가 있으면 더좋겠어요

0

160

1

BFS 코드 중에 이해가 안되는 부분이 있습니다.

0

219

1

호텔 연결 질문드립니다.

0

157

1

최대 선호 음식 질문드립니다.

0

217

1

숨겨진 합 질문드립니다.

0

150

1

제품이동 질문드립니다.

0

126

1

송아지 찾기2 질문드립니다.

0

125

1

정사각형 그리기 질문드립니다.

0

142

1

호텔연결

0

143

1

전투게임

0

168

1

숲속의 기사

0

131

1

멀티태스킹 질문드립니다.

0

194

1

숨겨진 합 자바 질문드립니다.

0

135

1

영화관람 시간초과 질문드립니다.

0

192

1

[2-5] 최대선호음식 시간초과..

0

263

1

dp 풀이는 어려운가요?

0

399

2

문제 의문

0

296

2

모의고사 7회 2번 송아지 찾기 테스트케이스 3번, 4번 오류

0

313

1

안녕하세요. 궁금한점이 있어서 질문드립니다.

0

244

1

BFS 참고하세요

0

265

1

#include<bits/stdc++.h>

0

761

1

잔디 문제 해설 c로 바꿔서 출력할 때

1

374

1

조합을 구할때 algorithm 함수 next_permutation 사용 가능 여부

0

459

1