반응형

 

[광고 누르면 오늘의 행운 상승!!]

https://programmers.co.kr/learn/courses/30/lessons/60057

 

코딩테스트 연습 - 문자열 압축

데이터 처리 전문가가 되고 싶은 어피치는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문자

programmers.co.kr

문자열 문제

1. 참고사항

- 문자열을 size/2 까지 잘라서 압축할 수 있다. (그 이상은 의미 x)
- j~j+i 만큼 잘랐는데 남은 수가 있다면 그냥 붙여준다.
- temp에 문자열을 저장했다가 같은 수가 들어오면 count를 증가시킨다.
- 문자열이 한개가 들어온다면 압축이 필요없으므로 1을 출력후 종료

2. 구현

- 1부터 size/2만큼 잘라서 넣는다.
- temp가 비어있다면 넣어주고 (처음 순서)
- temp와 이제 넣을 문자열이 같다면 count를 증가시키고
- temp와 이제 넣을 문자열이 다르다면 
      - 숫자가 1이라면 붙이지 않는다.
      - 숫자가 1 이상이라면 붙인다.
- zip 문자열에 temp를 붙인다.
- 큐가 비워지면 한번더 붙여준다. (마지막 문자열이 zip에 안들어갔기 때문)
- zip.length()의 최소를 갱신한다.

출력.

package Study9;

import java.io.*;
import java.util.*;

public class 문자열압축 {
	static int R,C,ans;
	static Queue<String> q;
	static int min = Integer.MAX_VALUE;
	public static void main(String[] args) throws Exception {
		String s = "aabbaccc";
		int size = s.length();
		q = new LinkedList<>();
		
		for (int i = 1; i <= size/2; i++) {
			String zip = ""; 
			for (int j = 0; j < size; j++) {
				String ss = "";
				if(j+i <= size) {
					//j부터 i만큼 잘라서 넣기
					ss = s.substring(j,j+i);
					j=j+i-1;
				}else {
					//남은 수 넣어주기
					ss = s.substring(j,size);
					break;
				}
				q.add(ss);
				
			}
			int cnt = 0;
			String temp = "";
			while(!q.isEmpty()) {
				//비어있다면 넣어주기
				if(temp.equals("")) {
					temp = q.poll();
					cnt++;
				}else {
					//같은 문자열이라면 숫자만 증가
					if(temp.equals(q.peek())) {
						q.poll();
						cnt++;
					}else {
						//1이 아닐때면 숫자도 넣어주기
						if(cnt != 1) {
							zip+= String.valueOf(cnt);
							cnt=1;
						}
						//압축된 문자열 넣기
						zip+= temp;
						temp=q.poll();
					}
				}
			}
			//마지막 큐라면 한번 더 넣어줘야 한다. (문자열에 안들어감)
			if(cnt>1)
			zip+= String.valueOf(cnt);
			zip+= temp;
			System.out.println(zip);
			
			min = Integer.min(min, zip.length());
		}
		min = min == Integer.MAX_VALUE ? 1:min;
		System.out.println(min);
	}
}
반응형

+ Recent posts