알고리즘/코딩테스트-Programmers

[Programmers] PCCP 모의고사 #1 외톨이 알파벳 JAVA

kwang2134 2024. 6. 29. 22:44
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