https://school.programmers.co.kr/learn/courses/30/lessons/12930
알고리즘 문제를 매일 최소 한 문제씩 푸는걸 목표로하고 있다.
오늘은 '이상한 문자 만들기'를 풀었는데, 이것저것 삽질을 많이 해서 다시는 까먹지 말자는 의미로 정리하려한다.
가벼운 후기 글이다.
오늘의 문제를 요약하자면 특정 위치의 문자를 대/소문자로 변경하는 것이다.
대문자, 소문자를 보자마자 생각난게 toUpperCase()와 toLowerCase()였다.
이때의 나는 toUpperCase()와 toLowerCase()가 "문자열"만을 대상으로 사용할 수 있다고 생각했다. 그리고 특정 문자만 바뀌는게 아니라 문자열 전체의 알파벨이 대/소문자로 변환되기 때문에 내가 필요로하는 기능이 아니라고 생각했다.
'그러면 문자열을 또 문자열로 잘게쪼갤까?'라는 생각이 들었지만 그건 너무 비효율적인 것 같았다. 그렇게 풀면 안 된다는 기분이 들어 좀 더 고민을 해봤다.
이번에는 '아스키 코드를 이용해볼까' 하는 생각이 들었다.
이게 정답인가하고 설렌것도 잠시 문제에는 문자열 s가 모두 소문자로 구성되어있다는 조건이 명시되어있지 않았다.
그러면 일단 대문자인지 소문자인지 일일이 판단을 해줘야한다는건데.. 음.. 나쁘지는 않은 것 같은데 대소문자 판별 클래스를 새로 만들거나, 조건문이 복잡해져야해서 역시 마음에 들지 않았다. 분명히 더 좋은 방안이 있을 것 같아서 좀 더 고민해보기로 했다.
StringBuilder도 찾아보고 이것저것 찾아보다가 문득, '특정 '문자'만 대소문자로 바꿀 수는 없을까?'라는 의문이 들었다. 그래서 찾아보니 Character.toUpperCase()와 Character.toLowerCase()가 있었다. 그렇다. 특정 문자도 대/소문자로 바꿀 수 있었다... 고민이 다시 원점으로 돌아가버린 것 같아 좀 허탈했지만 새로운걸 알았으니 소득은 있다고 긍정적으로 생각하기로 했다.
이전 자료를 뒤져보다가 .split()이라는 메서드도 찾았는데, ' 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다. '라는 조건에 딱 맞는다는 느낌이 들어 활용해보았다.
그렇게 만들어진 코드⬇️
class Solution {
public String solution(String s) {
String[] arr=s.split("");
String answer="";
int index=0;
for(String str: arr){
index=(str.equals(" "))?0:index+1;
answer+=(index%2!=0)?str.toUpperCase():str.toLowerCase();
}
return answer;
}
}
완전히 내가 생각해낸 코드는 아니다.
다른 사람이 낸 아이디어인데 이해하고 직접 작성해 보았다. (나는 .split()까지만 생각했다)
내가 생각한 로직은.. 문자열을 공백문자 기준으로 나눠서, 그걸 또 문자열 배열에 저장하고, 배열에 저장된 문자열을 문자 배열로 바꿔서, 그 문자를 하나씩 불러와서 대/소문자로 바꿔주는 복잡한 코드를 생각했는데..
위 코드는 진짜 간결하다.(세상에는 역시 똑똑한 사람이 많아)
저 로직이 꽤나 마음에 들어서 자주 보고 외워둘 생각이다.
[정리]
- 문자열과 문자 모두 toUpperCase() 와 toLowerCase()를 사용할 수 있다. (사용법이 좀 다르지만)
- StringTokenizer와 .nextToken() 말고 .split()으로도 데이터를 구분자 단위로 끊을 수 있다.
'프로그래밍 > JAVA 프로그래밍' 카테고리의 다른 글
[TIL] 최소직사각형(JAVA) (1) | 2024.11.18 |
---|---|
[백준]1744번 '수 묶기'(JAVA, 그리디) (0) | 2024.09.03 |
[코딩연습_JAVA] 크레인 인형뽑기 (0) | 2024.03.01 |
[코딩연습_JAVA] 괄호 문자 제거 (0) | 2024.02.20 |
[코딩연습_JAVA] 올바른 괄호 (0) | 2024.02.17 |