inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Test thử code (bằng C++): So sánh với các công ty lớn

2. Giải thích mã loại bỏ ký tự trùng lặp (bản đồ băm)

중복된 문자 제거 코드

215

xogh7532

13 câu hỏi đã được viết

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++ 코딩-테스트

Câu trả lời 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

158

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

245

1

BFS 참고하세요

0

266

1

#include<bits/stdc++.h>

0

761

1

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

1

374

1

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

0

460

1