프로그래머스에 있는 카카오톡 코딩테스트 문제를 풀어봤다.
문제는 아래와 같다.
https://programmers.co.kr/learn/courses/30/lessons/60057
코딩테스트 연습 - 문자열 압축
데이터 처리 전문가가 되고 싶은 어피치는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문자
programmers.co.kr
요점은 앞에서 부터 문자열을 잘잘라서 압축하면 된다.
아래는 내가 짠 코드이다.
import java.util.LinkedList;
import java.util.Queue;
class Solution {
public int solution(String s) {
// 1부터 전체길이/2 까지 압축해보아야함.
Queue<String> que=new LinkedList<String>();
int length = s.length();
int answer = length;
int start=0;
int last=0;
// 1, 2, ... 전체길이/2 순으로 잘라서 압축해보자.
// substring함수를 이용
// 잘라서 큐에 넣어준다음 하나씩 빼주면서 압축된 문자열을 만들어준다.
// i는 자를 길이수
for(int i = 1;i<length/2+1;++i){
for(int index=0;index<length;index+=i){
//시작과 끝인덱스를 잘 정해주어야 예외가 발생하지 않는다
start = index;
if(index>=length){
start=length-1;
}
last = index + i;
if(index+i>length)
last=length;
que.add(s.substring(start,last));
}
answer=getAnswer(answer,que);
}
return answer;
}
public String getStr(int count,String str){
String pre="";
if(count == 1)
pre="";
else
pre=String.valueOf(count);
return pre+str;
}
public int getAnswer(int answer, Queue<String> que){
//큐에서 하나씩 빼주면서 압축된 문자열을 만들어주는것.
String answerStr = "";
String temp = que.poll();
int length = 0;
int count = 1;
while(!que.isEmpty()){
if(temp.equals(que.peek())){
count++;
que.poll();
}else{
answerStr+=getStr(count,temp);
temp=que.poll();
count = 1;
}
}
answerStr+=getStr(count,temp);
length = answerStr.length();
if(answer>length){
return length;
}else{
return answer;
}
}
}
이중 for문이라 시간이 조금 느리다 ㅠㅠ
좀더 좋은방법을 찾아봐야한다.
아래 두 메소드는 코드가 너무길고 복잡하며 따로 분리해 낸 부분이다.
-끝-
'프로그래밍공부 > 알고리즘' 카테고리의 다른 글
코딩테스트 - 정수삼각형 (0) | 2020.08.06 |
---|---|
코딩테스트 - 파일명 정렬 (0) | 2020.08.04 |
카카오톡 코딩테스트 - 다트게임 (0) | 2020.08.04 |
코딩테스트 - K번째수 (0) | 2020.08.03 |
코딩테스트 - 알고리즘 공부 - 베스트앨범 (2) | 2020.07.28 |