티스토리 뷰
문제
같은 문자가 연속으로 반복될 경우, 그 횟수를 사용해 문자열을 압축하는 메서드를 구현하라. 가령 압축해야 할 문자열이 aabccccccccaaa라면 a2b1c8a3과 같이 압축되어야 한다. 압축 결과로 만들어지는 문자열이 원래 문자열보다 짧아지지 않는 경우, 이 메서드는 원래 문자열을 그대로 반환해야 한다.
풀이
문자열의 앞에서부터 같은 문자의 개수를 세고 다른 문자가 나오면 문자와 문자의 개수를 압축형태로 만들어나가면 됩니다.
이때 자바에서는 문자열을 + 연산으로 합치는 경우 새로운 문자열 객체를 생성하고 붙이는 작업을 수행할 때 O(n²)이 소요되어 문자배열을 사용해야 시간복잡도 O(n)으로 줄일 수 있습니다.
c++에서는 + 연산에서 새로운 문자열 객체를 생성하지 않는다고 하고 명확하진 않지만 일반적으로는 선형시간의 시간복잡도를 가진다고 하니 + 연산 혹은 append를 사용해도 무방할 것 같습니다.
구현 코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <string> | |
using namespace std; | |
//1번 : string 사용 | |
string compressBetter1(string str){ | |
string mystr; | |
char last = str[0]; | |
int count = 1; | |
for(int i=1;i<str.length();i++){ | |
//반복되는 문자만큼 카운트 증가시킨다. | |
if(str[i] == last) | |
count++; | |
//반복이 끝났으면 해당 문자를 압축형태로 추가해준다. | |
else{ | |
mystr.append(last + to_string(count)); | |
last = str[i]; | |
count = 1; | |
} | |
} | |
//위 반복문에서 마지막 문자에 대해서는 처리되지 않았기 때문에 | |
//마지막 문자를 압축형태로 추가해준다. | |
mystr.append(last + to_string(count)); | |
if(mystr.length() >= str.length()) | |
return str; | |
else | |
return mystr; | |
} | |
//2번 : char 배열 사용 | |
int setChar(char array[], char c, int index, int count){ | |
array[index++] = c; | |
for(char x : to_string(count)) | |
array[index++] = x; | |
return index; | |
} | |
string compressBetter2(string str){ | |
char *array = new char[str.length()]; | |
char last = str[0]; | |
int count = 1, index = 0; | |
for(int i=1;i<str.length();i++){ | |
if(str[i] == last) | |
count++; | |
else{ | |
index = setChar(array, last, index, count); | |
last = str[i]; | |
count = 1; | |
} | |
} | |
index = setChar(array, last, index, count); | |
if(string(array).length() >= str.length()) | |
return str; | |
else | |
return string(array); | |
} |
'Coding Test > 코딩인터뷰 완전분석' 카테고리의 다른 글
[c++] 코딩인터뷰 완전분석 - 배열과 문자열 7 (0) | 2020.09.25 |
---|---|
[c++] 코딩인터뷰 완전분석 - 배열과 문자열 6 (0) | 2020.09.24 |
[c++] 코딩인터뷰 완전분석 - 배열과 문자열 4 (0) | 2020.09.22 |
[c++] 코딩인터뷰 완전분석 - 배열과 문자열 3 (0) | 2020.09.21 |
[c++] 코딩인터뷰 완전분석 - 배열과 문자열 2 (0) | 2020.09.18 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 두니발 박사의 탈옥
- 하둡
- 삼각형 위의 최대 경로 수 세기
- 배열과 문자열
- 하이브
- 2225
- Jaeha's Safe
- 외발 뛰기
- 스파크
- 종만북
- python
- HDFS
- HiveQL
- Django
- 삼각형 위의 최대 경로
- import
- pyspark
- Hadoop
- 분할정복
- 알고스팟
- 출전 순서 정하기
- C++
- microwaving lunch boxes
- 완전탐색
- Sqoop
- 코딩인터뷰 완전분석
- 합친 lis
- hive
- 팰린드롬 구하기
- 백준
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함