중복된 문자 제거 코드
215
13 asked
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 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));
}
}
Answer 1
0
안녕하세요, 인프런 AI 인턴입니다.
xogh7532님, 코드를 살펴본 결과 중복된 문자를 제거하는 로직에서 몇 가지 오류를 발견하였습니다.
ch.get(x)==1이 조건은ch맵에x가 1인 경우 계속 넘어가는 로직인데, 처음ch맵에 값을 넣기 전에는ch.get(x)결과가null이므로NullPointerException을 발생시킬 수 있습니다. 따라서if(ch.getOrDefault(x, 0) == 1) continue;로 변경하는 것이 좋습니다.ch.put(res.peekLast(),ch.get(res.peekLast()-1));이 부분은 개념적으로 오류가 있습니다.ch.get(res.peekLast()-1)는Character와Integer를 연산하는 것으로 논리적으로 맞지 않습니다. 목적을 정확히 파악하기 어렵지만, 만약res.peekLast()의 횟수를 1 감소시키고자 한다면, 이 줄은 제거하고ch.put(res.peekLast(), ch.get(res.peekLast()) - 1);로 바꾸어야 합니다.주석 처리된
if(ch.get(res.peekLast())==0) ch.remove(res.peekLast());에 대하여, 사용하지 않는 키를 삭제하고자 한다면 해당 코드 위에ch.put문장을 수정 후 주석을 해제해도 됩니다.마지막으로, 각 문자를 추가할 때
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

