인프런의 "자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비" 강좌를 수강했습니다.
C, C++, Python, Js 등 다른 언어의 강의도 있으니 본인에게 맞는 강의를 선택하시면 됩니다. 😁
자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비 - 인프런 | 강의
자바(Java)로 코딩테스트를 준비하시는 분을 위한 강좌입니다. 코딩테스트에서 가장 많이 출제되는 Top 10 Topic을 다루고 있습니다. 주제와 연동하여 기초문제부터 중급문제까지 단계적으로 구성
www.inflearn.com
Q1-11. 문자열 압축
알파벳 대문자로 이루어진 문자열을 입력 받는데, 같은 문자가 연속으로 반복될 경우
반복되는 문자 바로 오른쪽에 반복 횟수를 표기해 문자열을 압축해 출력하라.
반복횟수가 1일 경우는 숫자를 생략한다.
입력 Sample | 출력 Sample |
---|---|
APPLE | AP2LE |
HAPPYYPPAH | HAP2Y2P2AH |
✏️ 내가 쓴 답
앞문자가 뒷문자와 같은지 비교해서 같으면 횟수를 세는 count 변수를 1 증가해주고,
다르면 answer 문자열에 해당 문자와 숫자를 누적시켜준다는 프로세스로 진행! 근데 못풀었다. ㅎ;;
😥 애매한 점
앞문자와 뒷문자를 비교하는 건 알겠으나 문제가 됐던건, 마지막까지 반복문을 돌았을 때
였다.
마지막에 위치한 문자는 비교할 문자가 없어서, IndexOutOfBoundsException
이 발생했다.
👨🏻🏫 풀이코드
강의를 참고하여 아래와 같이 수정했다.
우선 Scanner로 부터 문자열을 입력받아 solution() 메소드로 넘겨준다.
그리고 내가 어려워했던 부분, 입력받은 문자열 맨 뒤에 공백 문자
를 하나 더 추가해준다!
그래서 마지막 문자까지도 앞뒤 문자로 비교할 수 있도록 하는 것이다.
횟수를 카운트 할 cnt 변수는 1로 초기화한다. 문자는 어쨌든 최소 한개는 있는 것이니까 0보단 1로 초기화 한다.
문자열의 0번째 인덱스부터, 아까 문자열 맨뒤에 공백을 추가했기 때문에 문자 길이가 +1이 되었으므로 이를 제외한 str.length()-1
까지(원래 문자열 길이까지) 반복한다. str.length() 까지 반복하면 또 IndexOutOfBoundsException
이 발생해버리니까 주의하자!
앞 문자가 뒷문자열과 같은지 비교했을 때, 다를 경우 비교 대상인 앞 문자를 answer 문자열에 누적한다.
개수가 여러개일 경우 문자열 뒤에 cnt (cnt > 1) 도 함께 누적해주고, 개수가 1일 경우에는 숫자를 생략하기 때문에 누적하지 않아도 된다.
cnt=1로 다시 초기화 해줄 것!
import java.util.Scanner;
public class Main {
public String solution(String str){
String answer = "";
str = str+" ";
int cnt = 1;
for(int i=0; i<str.length(); i++){
// 앞 글자와 같을 때
if(str.charAt(i) == str.charAt(i+1)) cnt++;
// 앞 글자와 다를 때
else {
answer += str.charAt(i);
if(cnt != 1) answer += String.valueOf(cnt);
cnt = 1;
}
}
return answer;
}
public static void main(String[] args) {
Main main = new Main();
Scanner sc = new Scanner(System.in);
String str = sc.next();
System.out.println(main.solution(str));
}
}
공백문자를 추가만 했다면, 생각보다 어렵지 않은 문제였다.
🤓 정리
- 문자열의 각 자리를 비교할 때, 맨 앞/맨 마지막 문자가 비교하기 애매할 경우 공백을 추가해주는 것도 한 방법이다.
- 입력된 문자열을 적절하게 수정할 수 있다는 점을 두려워 하지말자!
풀 수 있을것만 같은 문제를 풀지 못했을 때 너무 아까운 것 같다..
역시 문제를 많이 풀어봐야 하나보다!
'Study > 알고리즘' 카테고리의 다른 글
[알고리즘/인프런] Array(1, 2차원 배열) #2-01. 큰 수 출력하기 (0) | 2022.05.08 |
---|---|
[알고리즘/인프런] String(문자열) #1-12. 암호 찾기 (0) | 2022.05.02 |
[알고리즘/인프런] String(문자열) #1-10. 가장 짧은 문자거리 (0) | 2022.04.27 |
[알고리즘/인프런] String(문자열) #1-09. 숫자만 추출 (0) | 2022.04.18 |
[알고리즘/인프런] String(문자열) #1-08. 유효한 팰린드롬 (0) | 2022.04.17 |