728x90
728x90
반응형
[Programmers] PCCP 모의고사 #1 외톨이 알파벳
접근
- 중복 제거
- 정규식
- replaceAll
- Map
풀이
같은 알파벳이 문자열 내에 두 개 이상 떨어져 존재한다면 외톨이 알파벳이다. 연속된 덩어리 알파벳은 외톨이가 아니다. 즉 문자열 내에 존재하는 알파벳들을 2개 이상 중복되는 부분을 모두 한 개로 치환한 다음. 각 알파벳의 등장 횟수를 계산해 2회 이상 등장했다면 외톨이 알파벳이 되는 것이다.
String makeOne = input_string.replaceAll("(.)\\1+", "$1");
정규식을 사용해 치환하는 이 코드 한 줄로 문제의 80퍼센트는 이미 해결되었다. 정규식에 대해 설명해 보자면 (.)은 임의의 문자를 뜻한다. 입력받는 문자는 알파벳 소문자로 제한된다는 사항이 있기 때문에 굳이 알파벳으로 특정해 주지는 않았다. \\1+ 은 앞에서 매칭된 문자가 1개 이상 연속으로 반복된다는 것을 의미한다. $1는 첫 번째 매칭된 문자를 의미한다. (.)\\1+, $1는 임의의 2개 이상 연속된 문자를 첫 번째 문자로 치환한다는 뜻이다.
Map<Character, Integer> map = new HashMap<>();
for(int i = 0; i < makeOne.length(); i++){
map.merge(makeOne.charAt(i), 1, (a,b) -> a + b);
}
알파벳의 등장 횟수를 셀 map을 선언하고 채워준다.
List<Character> ls = new ArrayList<>();
for(Character key : map.keySet()){
int value = map.get(key);
if(value >= 2){
ls.add(key);
}
}
문제의 정답 조건인 알파벳순으로 리턴하기 위해 2회 이상 등장하는 알파벳을 리스트에 추가해 준다.
if(ls.isEmpty()) return "N";
Collections.sort(ls);
만약 리스트가 비었다면 2회 이상 등장한 알파벳이 없었다는 의미로 N을 반환한다. 리스트가 비어있지 않다면 알파벳순 출력을 위해 정렬한다.
return ls.stream()
.map(String::valueOf)
.collect(Collectors.joining());
문자열 출력을 위해 stream을 사용해 만들어 주었다. stream을 사용하게 되면 효율은 반복문으로 직접 만들어 주는 거보다 좋지 않지만 간편하게 변환할 수 있다.
전체 코드
import java.util.*;
import java.util.stream.*;
class Solution {
public String solution(String input_string) {
String makeOne = input_string.replaceAll("(.)\\1+", "$1");
Map<Character, Integer> map = new HashMap<>();
for(int i = 0; i < makeOne.length(); i++){
map.merge(makeOne.charAt(i), 1, (a,b) -> a + b);
}
List<Character> ls = new ArrayList<>();
for(Character key : map.keySet()){
int value = map.get(key);
if(value >= 2){
ls.add(key);
}
}
if(ls.isEmpty())
return "N";
Collections.sort(ls);
return ls.stream()
.map(String::valueOf)
.collect(Collectors.joining());
}
}
정규식과 replace를 통해 간단하게 해결되었다.
728x90
'알고리즘 > 코딩테스트-Programmers' 카테고리의 다른 글
[Programmers] PCCE 기출문제 9번 / 지폐 접기 JAVA (0) | 2024.09.13 |
---|---|
[Programmers] 과제 진행하기 JAVA (0) | 2024.08.18 |
[Programmers] PCCP 모의고사 #2 체육대회 JAVA (0) | 2024.06.30 |
[Programmers] 코딩테스트 디스크 컨트롤러 JAVA (0) | 2024.06.28 |
[Programmers] 코딩테스트 광물 캐기 JAVA (0) | 2024.06.18 |