일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- spring
- 클라우드 서비스 개발 #
- Gradle
- 리눅스
- AWS
- 클라우드 서비스 개발
- route 53
- Java
- https
- 우리FIS아카데미 #
- sts
- 우리FISA #
- 우리FIS아카데미
- 우리에프아이에스 #
- 맥북
- 맥
- jdk
- M2
- mysql
- 로드밸런스
- HTTP
- 맥OS
- 글로벌소프트웨어캠퍼스
- 도메인
- springboot
- 우리FISA
- 우리에프아이에스
- dbeaver
- K-디지털트레이닝
- Today
- Total
<<개발일지>>
[문자열] 11. 문자열 압축 본문
설명
알파벳 대문자로 이루어진 문자열을 입력받아 같은 문자가 연속으로 반복되는 경우 반복되는
문자 바로 오른쪽에 반복 횟수를 표기하는 방법으로 문자열을 압축하는 프로그램을 작성하시오.
단 반복횟수가 1인 경우 생략합니다.
입력
첫 줄에 문자열이 주어진다. 문자열의 길이는 100을 넘지 않는다.
출력
첫 줄에 압축된 문자열을 출력한다.
예시 입력 1
KKHSSSSSSSE
예시 출력 1
K2HS7E
예시 입력 2
KSTTTSEEKFKKKDJJGG
예시 출력 2
KST3SE2KFK3DJ2G2
<<풀이>>
-> 일단 나의 풀이이다.
import java.util.Scanner;
class Main {
public String solution(String str) {
int count = 1;
String answer = "";
for (int i = 0; i < str.length() - 1; i++) {
if (str.charAt(i) == str.charAt(i + 1)) {
count++;
} else {
if (count == 1) {
answer += str.charAt(i);
} else {
answer += str.charAt(i);
answer += count;
}
if (str.charAt(i + 1) == str.charAt(str.length()-1)) {
answer += str.charAt(i + 1);
if (count > 1) {
answer += count;
}
}
count = 1;
}
}
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner in = new Scanner(System.in);
String str = in.next();
System.out.println(T.solution(str));
}
}
이렇게 하면 제시한 예시의 입력값에 출력값은 맞다. 하지만 채점 사이트에서는 오답으로 나온다 ㅋㅋ ㅠ 솔직히 나도 이 문제를 풀면서 처음에는 구조적으로 움직였지만 뒤에는 중간에 추가하고 빼고 넣고 이렇게 했어서 다시 풀어라고 하면 무조건 막힌다.
근데!!
import java.util.Scanner;
class Main {
public String solution(String str) {
int count = 1;
String strr = str + " ";
String answer = "";
for (int i = 0; i < strr.length() - 1; i++) {
if (strr.charAt(i) == strr.charAt(i + 1)) {
count++;
if (i == strr.length()-2) {
answer += strr.charAt(i);
answer += count;
}
} else {
if (count == 1) {
answer += strr.charAt(i);
} else {
answer += strr.charAt(i);
answer += count;
}
count = 1;
}
}
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner in = new Scanner(System.in);
String str = in.next();
System.out.println(T.solution(str));
}
}
살짝 힌트를 들은 후 푼 문제 ! 바로 정답이다 ㅎㅎ
핵심은 원래 str값에 " "를 더해주는 것이다. 그렇다면 내가 처음에 구상했던 방식이 작동한다. 두 번째 풀이가 원래 내가 구상한거였고 첫번째 풀이가 구상한 것에서 마구마구 변형된 형태이다.
<<선생님 풀이>>
import java.util.Scanner;
class Main {
public String solution(String s) {
String answer = "";
s = s + " ";
int cnt = 1;
for (int i = 0; i < s.length() - 1; i++) {
if (s.charAt(i) == s.charAt(i + 1)) cnt ++;
else {
answer += s.charAt(i);
if (cnt > 1) answer += String.valueOf(cnt);
cnt = 1;
}
}
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner in = new Scanner(System.in);
String str = in.next();
System.out.println(T.solution(str));
}
}
심플하고 코드가 깔끔하다 ㅋㅋ 나는 cnt가 1일 때와 >1일 때 이렇게 나눠서 했는데 선생님 풀이는 한 줄 안에 끝내 버렸다.
처음 부터 이렇게 깔끔하게 적는다는 건 힘들다. 천천히 차근차근 논리적인 생각을 하는 연습을 한다면, 계속해서 좋아지고 성장할 것이다.
<<추가 공부>>
String.valueOf(int) -> 정수값을 문자열로 바꿔준다. 이 외에도 문자 배열을 합쳐 문자열로 반환시켜주기도 한다.
'코딩테스트' 카테고리의 다른 글
[배열] 1. 큰 수 출력하기 (1) | 2023.12.08 |
---|---|
[문자열] 12. 암호 (1) | 2023.12.07 |
[문자열] 10.가장 짧은 문자거리 (1) | 2023.12.03 |
[문자열] 9. 숫자만 추출 (2) | 2023.12.03 |
[문자열] 8. 유요한 팰린드롬 (1) | 2023.12.03 |