https://school.programmers.co.kr/learn/courses/30/lessons/77886
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
Solve
1. 문자열에서 110이 생기는 경우 110을 뽑아내고 개수를 센다.
2. 110을 제거하고 남은 문자열에서 뒷부분부터 체크했을때, 0 다음에 110개수 만큼 110을 추가한다.
그러면 사전 순으로 앞에 오도록 문자열이 변경된다.
3. 해당 문자열을 result에 담고 answer 배열에 넣는다.
위와 같은 방식으로 풀이를 전개했다.
for(int i=0; i<s.length; i++){
List<Character> list = new ArrayList<>();
String curr = s[i];
int count110 =0;
for(int j=0; j<curr.length(); j++){
list.add(curr.charAt(j));
int size = list.size();
if(size>=3 && list.get(size-1)=='0'&&list.get(size-2)=='1'&&list.get(size-3)=='1'){
count110++;
list.remove(size-1);
list.remove(size-2);
list.remove(size-3);
}
}
List 에 문자열의 char 값을 하나씩 추가하면서 110이 존재하는지 체크한다.
// list에 있는 문자들 문자열로 바꾸기
StringBuilder sb = new StringBuilder();
list.stream().forEach(sb::append);
//:: 의미 : sb클래스의 append메서드 참조
String remain = sb.toString();
Collection의 경우 Stream api 를 사용할 수 있다.
forEach를 사용해서 sb에 각 문자들을 append 해주었다.
그렇게 담은 sb는 String으로 변환해준다.
StringBuilder result = new StringBuilder();
int index = remain.lastIndexOf('0')+1;
result.append(remain.substring(0,index));
for(int k=0; k<count110; k++)result.append("110");
result.append(remain.substring(index));
이후 result 에 결과적으로 문자열을 만들어서 넣어주어야한다.
lastIndexOf('0')은 remain 문자열을 뒤에서 부터 읽었을때 0이 나오는 위치를 알려준다.
해당 위치의 뒤에 '110'을 담을 것이기에 +1을 해주었다.
substring은 시작인덱스와, 끝 인덱스 값까지 문자열을 잘라준다.
Answer
import java.util.*;
class Solution {
public String[] solution(String[] s) {
String[] answer = new String[s.length];
for(int i=0; i<s.length; i++){
List<Character> list = new ArrayList<>();
String curr = s[i];
int count110 =0;
for(int j=0; j<curr.length(); j++){
list.add(curr.charAt(j));
int size = list.size();
if(size>=3 && list.get(size-1)=='0'&&list.get(size-2)=='1'&&list.get(size-3)=='1'){
count110++;
list.remove(size-1);
list.remove(size-2);
list.remove(size-3);
}
}
// list에 있는 문자들 문자열로 바꾸기
StringBuilder sb = new StringBuilder();
list.stream().forEach(sb::append); //:: 의미 : sb클래스의 append메서드 참조
String remain = sb.toString();
StringBuilder result = new StringBuilder();
int index = remain.lastIndexOf('0')+1;
result.append(remain.substring(0,index));
for(int k=0; k<count110; k++)result.append("110");
result.append(remain.substring(index));
answer[i] = result.toString();
}
return answer;
}
}
반응형