문제 설명
문자열 my_string
이 매개변수로 주어질 때, 대문자는 소문자로 소문자는 대문자로 변환한 문자열을 return하도록 solution 함수를 완성해주세요.
제한사항
- 1 <= my_string
의 길이 <= 1,000
- my_sring
은 영어 대문자와 소문자로만 구성되어 있습니다.
입출력 예
my_string | result |
---|---|
"cccCCC" | "CCCccc" |
"abCdEfghIJ" | "ABcDeFGHij" |
입출력 예 설명
입출력 예 #1
- 소문자는 대문자로 대문자는 소문자로 바꾼 "CCCccc"
를 return합니다.
입출력 예 #2
- 소문자는 대문자로 대문자는 소문자로 바꾼 "ABcDeFGHij"
를 return합니다.
문제를 읽자마자 나는 대문자와 소문자를 각각 따로 구분해서 서로 바꿔주면 될 것 같다고 생각하였다.
그래서 아래와 같이 작성하였다.
class Solution {
public String solution(String my_string) {
String answer = "";
for (int i = 0; i < my_string.length(); i++) {
char ch = my_string.charAt(i);
if (ch >= 'a' && ch <= 'z') {
ch -= 32;
} else if (ch >= 'A' && ch <= 'Z') {
ch += 32;
}
answer += ch;
}
System.out.println(answer);
return answer;
}
}
소문자는 대문자로, 대문자는 소문자로 바꾼 다음 해당 문자들을 하나로 이어붙여 문자열을 return 하도록 작성하였다.
먼저 for
문을 이용하여 my_string
에 있는 문자열들을 charAr
메서드를 활용하여 문자 하나하나로 분리하였다.
그런 다음, if-else
문을 활용해서 소문자는 대문자로, 대문자는 소문자로 바꿔주는 코드를 작성하였다.
소문자는 대문자로 바꿔주는 원리는 아스키 코드의 원리를 이용하였다.
아스키 코드 기준으로 대문자에서 32를 더하면 소문자가 되기 때문에 이를 이용하여 연산하였다.
다른 사람의 풀이를 찾아보았다.
import java.util.stream.Collectors;
class Solution {
public String solution(String myString) {
return myString.chars()
.mapToObj(operand -> String.valueOf((char) (
Character.isLowerCase(operand)
? Character.toUpperCase(operand)
: Character.toLowerCase(operand)
)))
.collect(Collectors.joining());
}
}
처음에는 매우 어려워보였지만 하나씩 뜯어보았다.
myString.chars()
는 입력 문자열 myString
의 각 문자를 아스키코드값으로 변환해서 IntStream
으로 만든다.
예를 들어 "HeLLo"
라는 문자열이 있다면 이를 ['H', 'e', 'L', 'L', 'o']
으로 변환하고, 다시 한 번 [72, 101, 76, 76, 111]
으로 변환한다.
.mapToObj(...)
는 각 문자 코드(정수 값)를 객체로 변환하는 역할을 한다. 변환 규칙은 아래와 같다.
- Character.isLowerCase(operand)
: 현재 문자가 소문자인지 확인한다. true
라면 소문자이고, false
라면 대문자이다.
- Character.toUpperCase(operand)
: 소문자라면 대문자로 변환한다.
- Character.toLowerCase(operand)
: 대문자라면 소문자로 변환한다.
- 변환된 문자 코드를 char로 변환하고 문자열로 반환한다.
마지막으로 Collectors.joining()
을 사용하여 변환된 스트림을 다시 하나의 문자열로 결합한다.
예를 들어 ['h', 'E', 'l', 'l', 'O']
를 문자열 "hEllO"
로 바꿔준다.
이 역시 나에게는 매우 어려운 코드였다..
하지만 코드의 가독성도 중요하다고 생각하기에 내가 푼 방법도 괜찮지 않을까라는 생각도 든다.
물론 나의 부족한 점은 계속 알고리즘을 풀어나가면서 채워나갈 것이다.
'problem solving' 카테고리의 다른 글
[프로그래머스] 정수 내림차순으로 배치하기 (0) | 2024.12.01 |
---|---|
[프로그래머스] 문자열 내 p와 y의 개수 (0) | 2024.11.29 |
[프로그래머스] 두 수의 연산값 비교하기 (0) | 2024.11.27 |
[프로그래머스] 가위 바위 보 (0) | 2024.11.26 |
[프로그래머스] 배열 비교하기 (0) | 2024.11.26 |