인프런의 "자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비" 강좌를 수강했습니다.
Q1-02. 대소문자 변환
첫 줄에 문자열이 입력 된다. 대문자와 소문자가 같이 존재하는 영어 알파벳으로 된 문자열을 입력받아, 소문자는 대문자로, 대문자는 소문자로 출력하는 프로그램
즉 StuDy 단어가 입력됐다면, sTUdY 라고 출력되어야 함
✏️ 내가 쓴 답
1번 문제에서 배웠던 toCharArray(), Character 객체에 접근하는 것을 활용했다.
Scanner로 입력받은 문자열 str을 toCharArray()로 char[] 배열로 쪼개고, array[]의 0번째 값부터 대소문자 여부를 체크하기로 했다.
Character.isUpperCase(), Character.isLowerCase() 를 이용해 문자 배열 array의 i번째 문자가 대문자인지 소문자인지 체크하고, 대소문자를 바꿔주고, 비교 후 char[] 배열을 String으로 반환해주었다.
이렇게 제출하니 정답!!✅ 그런데 foreach 문을 쓰면서 좀 더 짧고 쉽게 할 수 있을 것 같은데.. 싶었다.
package inflearn;
import java.util.Scanner;
public class Main {
public String solution(String str){
char[] array = str.toCharArray();
for(int i=0; i<array.length; i++){
if(Character.isUpperCase(array[i])){
array[i] = Character.toLowerCase(array[i]);
} else {
array[i] = Character.toUpperCase(array[i]);
}
}
return new String(array);
}
public static void main(String[] args){
Main main = new Main();
Scanner sc = new Scanner(System.in);
System.out.println(question.solution(sc.next()));
}
}
💪🏻 보완하고 싶은 점
- 코딩 테스트라는게 어떻게하든 답을 제출해서 컴파일 성공하면 되긴 하지만, 기본으로 적혀진 String answer = "" 과 같은 변수도 활용하는 게 좋을 것 같다. 그 들이(?) 원하는 답이 될 변수니까!
- 처음에는 foreach 문을 사용해 if문까지 다다르긴 했으나, 해당 문자가 존재하는 index위치를 알 수 있는 방법을 몰라 일반 for문으로 방향을 정했다.
for(char x : array){
if(Character.isUpperCase(x)){
// 해당 x가 위치하는 index번째의 array[index]의 값을 소문자로 바꾸고 싶은데
// index값을 어떻게 알아야하지?
}
}
👨🏻🏫 수정한 코드
강의를 참고하여 아래와 같이 실행했다.
첫 번째 방법
첫 번째 방법은 바꾼 문자를 String에 누적하는 것이다. 처음에 내가 생각했던 array[index] 문자 하나하나를 바꾼 후 다시 저장하는 방법도 있지만,
바꾼 알파벳을 그냥 String answer 문자열에 누적시켜주면 되는 아주 쉬운 방법이 있었다. 내가 작성한 방법이랑 유사한듯.
import java.util.Scanner;
public class Main {
public String solution(String str){
String answer = "";
for(char x : str.toCharArray()){
if(Character.isUpperCase(x)) answer += Character.toLowerCase(x);
else answer += Character.toUpperCase(x);
}
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));
}
}
두 번째 방법
두 번째 방법은 ASCII코드를 이용하는 방법이다.
대문자 A-Z 를 ascii 코드로 변환하면 65~90까지고, 소문자 a-z까지는 97~122까지이다.
대문자와 소문자 간 ascii 코드 차이는 32만큼 난다는 것을 알아야 사용할 수 있는 방법이다. (97-65)
char x의 ascii 값이 65 이상 90 이하일 경우= 대문자이므로 x+32로 대문자로 변환한다.
예를 들어 char x값이 A(65)일 경우 대문자이므로, x+32 = 97(a)가 된다.
이 때 주의할 점은 ascii 코드를 다시 문자로 변환하기 위해 type casting 해줘야 한다. 까묵지 말자
1학년 수업 때 ascii 코드 많이 썼는데...😅 이 문제를 풀 때는 방법을 생각 못했었다.
...
String answer = "";
for(char x : str.toCharArray()) {
if(x>=65 && x<=90) answer += (char)(x+32);
else answer += (char)(x-32)
}
return answer;
🤓 정리
- 어렵게 풀어야 한다는 생각보다 단순하게 생각해야 할 필요도 있다.
- 문자열(String) 에도 += (대입연산자) 사용 가능!
- 알파벳은 ASCII Code로도 활용할 수 있음을 기억하자. (대문자 A~Z : 65~90 / 소문자 a~z : 97~122)
- 대문자 ASCII Code와 소문자 ASCII Code 사이 숫자는 32만큼 차이나는 것을 통해 대소문자 변경이 가능하다.
'Study > 알고리즘' 카테고리의 다른 글
[알고리즘/인프런] String(문자열) #1-06. 중복문자제거 (2) | 2022.04.14 |
---|---|
[알고리즘/인프런] String(문자열) #1-05. 특정문자 뒤집기 (0) | 2022.04.13 |
[알고리즘/인프런] String(문자열) #1-04. 단어 뒤집기(StringBuilder) (0) | 2022.04.12 |
[알고리즘/인프런] String(문자열) #1-03. 문장 속 단어 (0) | 2022.04.07 |
[알고리즘/인프런] String(문자열) #1-01. 문자 찾기 (0) | 2022.04.05 |