티스토리 뷰
1. 문제
https://programmers.co.kr/learn/courses/30/lessons/60057?language=java
코딩테스트 연습 - 문자열 압축
데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문
programmers.co.kr
2. 풀이
- 문자열이 압축 되기 위해 가능한 길이의 최댓값은 (문자열 길이)/2 이므로, for문을 통해 1~(문자열 길이)/2까지 증가시키며 압축을 진행한다
- 증가시키는 인덱스의 값이 압축되는 패턴의 길이다.
- 압축을 진행한 결과 가장 길이가 짧은 값을 리턴한다.
- 압축
- for문으로, 이전의 패턴 문자열과 비교할 현재의 문자열(nowZip)을 정한다
- i + len < s.length()면 패턴 길이만큼 자른다
- 패턴 길이보다 작은 상황이면, 압축이 불가능하므로 진행하지 않는다.
- 패턴이 없는 경우 == 맨 처음이 아닌 경우, 이전의 패턴과 현재의 문자열(nowStr)을 비교한다.
- 패턴이 일치하면(nowZip.equals(nextZip)) 압축이 가능하므로, 압축 횟수를 의미하는 zipCnt 변수 값을 증가시킨다.
- 패턴이 일치하지 않지만, 이전에 압축이 진행된 경우, 압축 횟수와 문자열을 더해 압축을 진행한다.
- for문으로, 이전의 패턴 문자열과 비교할 현재의 문자열(nowZip)을 정한다
3. 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | class Solution { public int solution(String s) { int answer = s.length(); for(int l = 1; l <= s.length()/2; l++){ int zipCnt = 1; // 압축 횟수 String nowZip = s.substring(0, l); // 현재 압축한 문자열 int nowLen = s.length(); // 현재 문자열 길이 for(int i = l; i < s.length(); i += l){ if(i+l > s.length()) continue; // 압축 불가능한 경우 String nextZip = s.substring(i, i + l); // 다음 문자열 if(nowZip.equals(nextZip)){ // 압축 가능 zipCnt++; }else{ // 압축 불가능 if(zipCnt != 1){ int numLen = String.valueOf(zipCnt).length(); nowLen = nowLen - l * (zipCnt - 1) + numLen; } zipCnt = 1; nowZip = nextZip; // 다음 문자열이 압축할 문자열 } } if(zipCnt != 1){ int numLen = String.valueOf(zipCnt).length(); nowLen = nowLen - l * (zipCnt - 1) + numLen; } answer = Math.min(answer, nowLen); } return answer; } } | cs |
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[JAVA/구현] 프로그래머스 오픈채팅방 (0) | 2021.11.24 |
---|---|
[JAVA/수학] 프로그래머스 멀쩡한 사각형 (0) | 2021.11.17 |
[JAVA/구현] 프로그래머스 숫자 문자열과 영단어 (0) | 2021.11.17 |
[JAVA/BFS] 프로그래머스 단어 변환 (0) | 2021.10.27 |
[JAVA/DP] 프로그래머스 N으로 표현 (0) | 2021.10.21 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- ESP8266
- 아두이노
- 집배원 한상덕
- 키 순서
- FTP
- 자바
- 스티커모으기2
- dht11
- 워드프레스
- the pads
- BFS
- 리눅스
- DP
- hackerrank
- 구슬 탈출2
- dovecot
- c++
- 2981
- 11503
- 라즈비안
- 백준
- 라즈베리파이
- 프로그래머스
- hc-06
- mysql
- 합승 택시 요금
- 메일서버
- 블루투스
- git
- java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함