문제 설명
문자열에 연속한 2개의 같은 문자가 존재하지 않도록 만들고 싶습니다.
연속한 2개의 같은 문자가 존재한다면 이 문자를 지우고 남은 문자열을 이어 붙입니다.
이 과정을 연속한 2개의 같은 문자가 없을 때까지 반복하면 목표한 문자열을 얻게 됩니다.
문자열 s가 주어질 때, 위와 같은 과정을 적용해서 나오는 문자열을 출력하는 프로그램을 구현하세요.
입력 형식
· S: 주어진 문자열
출력 형식
· 중복을 모두 제거한 문자열을 반환
제약 사항
· 0 < S.length <= 100000
· S는 알파벳 소문자로 이루어져 있습니다.
입출력 예시
· 입력
· S = "aacddefg"
· 출력: "cefg"
· 설명: 중복되는 문자열 a, d를 제거하면 답안을 얻게 된다.
작성 코드
(20/20)
import java.util.Stack;
import java.util.stream.Collectors;
class Solution {
public String solution(String S) {
// 문자를 저장하기 위한 Stack 객체인 word를 생성
Stack<Character> word = new Stack<>();
/* 문자열 S의 각 문자를 하나씩 순회
toCharArray() 메서드는 String 객체에 대해 호출할 수 있는 메서드 중 하나로,
String 객체를 char 배열로 변환하여 반환합니다.
*/
for (char i : S.toCharArray()) {
// word가 비어있거나 word의 top이 현재 문자 i와 다른 경우에는 word에 i를 추가
if(word.isEmpty() || word.peek() != i) word.push(i);
else word.pop(); // 그렇지 않은 경우에는 word의 top을 제거
}
// word를 스트림으로 변환한 후, 각 문자를 문자열로 변환하여 하나의 문자열로 연결
String strValue = word.stream()
.map(String::valueOf)
/* valueOf 메서드는 자바에서 매개변수로 주어진 값을 해당 자료형으로 변환하여 반환하는 메서드
String 클래스에서는 valueOf 메서드를 통해 매개변수로 주어진 값을 String 자료형으로 변환
::는 자바에서 메서드 참조(Method Reference)를 표현하는 연산자
:: 연산자를 사용하면 메서드를 호출하지 않고, 해당 메서드 자체를 참조할 수 있음
즉, word.stream()으로 생성된 Stream<Character>에 대해 map 메서드를 호출하면서,
String::valueOf를 매개변수로 전달함으로써, Stream<Character>에서 문자를 문자열로 변환하는 작업을 수행
*/
.collect(Collectors.joining());
// Stream에서 각 문자열을 하나의 문자열로 연결합니다. 이 때, Collectors 클래스의 joining 메서드를 사용
// 이 메서드는 구분자(delimiter)를 지정하지 않으면, 연결되는 문자열 사이에 구분자 없이 연결
return strValue;
}
public static void main(String[] args) {
Solution st = new Solution();
String s = "aacddefg";
System.out.println(st.solution(s));
}
}
정답 코드
import java.util.Stack;
class Solution {
public String solution(String s) {
Stack<Character> stack = new Stack<>();
for (char c: s.toCharArray()) {
if (stack.size() > 0 && stack.peek() == c) {
stack.pop();
} else {
stack.push(c);
}
}
StringBuilder sb = new StringBuilder();
while (!stack.isEmpty()) {
sb.append(stack.pop());
}
return sb.reverse().toString();
}
}
'연습 코딩테스트' 카테고리의 다른 글
연습문제 1-3(3) 중복 알파벳 소거하기 (0) | 2023.04.01 |
---|---|
연습문제 1-3(2) 괄호 짝 판단하기 (0) | 2023.04.01 |
연습문제 1-2(5) 배열 0에서 가장 가까운 값 (0) | 2023.03.30 |
연습문제 1-2(4) n번째 주문 취소된 주문 번호 구하기 (0) | 2023.03.30 |
연습문제 1-2(3) N개의 최대공약수 구하기 (0) | 2023.03.30 |