문제설명
영어 알파벳으로 이루어진 문자열 str이 주어집니다.
각 알파벳을 대문자는 소문자로 소문자는 대문자로 변환해서 출력하는 코드를 작성해 보세요.
제한사항
- 1 <= str의 길이 <= 20
- str은 알파벳으로 이루어진 문자열입니다.
입력 #1
aBcDeFg
출력 #1
AbCdEfG
[제출 답안]
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.next();
if(input.length() >= 1 && input.length() <= 20) {
String[] strArray = input.split("");
String data = "";
for (int i = 0; i <= strArray.length-1; i++) {
String alphabet = strArray[i];
int ascii = strArray[i].charAt(0);
/* 알파벳으로만 이루어진 경우 실행 */
if ((ascii >= 65 && ascii <= 90) || (ascii >= 97 && ascii <= 122)) {
boolean result = isUpperLower(ascii);
if (result) { //true일 경우 소문자
data += alphabet.toUpperCase();
}
if (!result) { //false일 경우 대문자
data += alphabet.toLowerCase();
}
}
}
System.out.println(data);
}
}
public static boolean isUpperLower(int ascii) {
boolean result = false;
/* 소문자 일 경우 true */
if (ascii >= 65 && ascii <= 90) {
result = false;
}
/* 대문자일 경우 false */
if (ascii >= 97 && ascii <= 122) {
result = true;
}
return result;
}
}
[풀이과정]
핵심 : ascii 값, split(String value), charAt(int idx)
스캐너를 통해 입력받은 input 데이터에 대해 split() 메소드를 사용하여 String 배열로 변환한다.
변환된 String배열의 길이만큼 반복문을 사용하여 각 요소에 접근하여 String 문자열로 추출한 뒤,
해당 문자열을 charAt() 메소드를 통해 int로 변환한뒤 ascii 코드값으로 사용될 int타입 변수에 담아준다.
반복문 내에서 각 요소의 ascii값을 기준으로 if조건문을 통해 알파벳 여부를 검증하고
알파벳이 맞다면 대/소문자 여부를 boolean으로 받아온다.
true일 경우 기존 알파벳 요소를 대문자로 변경하여 누적으로 저장하고, false일 경우 소문자로 변경하여 누적으로 저장한다.
[리팩토링]
String에 누적으로 저장할 때 StringBuffer를 활용하면 좋을것 같다.
[다른사람 풀이]
핵심 : Character.isLower(Upper)Case(char c), toLower(Upper)Case(char c) / String.toCharArray()
Character.isUpperCase(char c)
char 타입의 Wrapper 형인 Character의 메소드인 isUpperCase 혹은 isLowerCase는
해당 문자의 대/소문자 여부를 확인하여 boolean으로 반환한다.
먼저 입력받은 String문자를 toCharArray()를 통해 배열로 반환한 뒤
향상된 for문을 통해 반환받은 Character 타입의 데이터의 대/소문자 여부를 확인한 뒤
대문자일 경우 toLowerCase()메소드를 활용하여 소문자로 변환하고 소문자일 경우 toUpperCase() 메소드를 활용하여 대문자로 변환한다.
import java.util.*;
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String a = sc.next();
String answer = "";
for(Character c : a.toCharArray()){
if(Character.isUpperCase(c)){
answer += Character.toLowerCase(c);
}
if(Character.isLowerCase(c)){
answer += Character.toUpperCase(c);
}
}
System.out.println(answer);
}
}
핵심: String.valueOf(int idx)
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String a = sc.next();
String answer = "";
for (int i=0; i<a.length(); i++) {
char index = a.charAt(i);
if (index >= 65 && index <= 90) {
answer += String.valueOf(index).toLowerCase();
} else {
answer += String.valueOf(index).toUpperCase();
}
}
System.out.println(answer);
}
}
내가 작성한 코드의 방식과의 가장 중요한 차이점은 valueOf(int idx)를 통해 문자열에서 매개변수로 넘긴 인덱스에 위치한 문자에 바로 접근한다.
이로 인해 불필요한 split코드를 제거할 수 있게 된다.
또한 ascii코드의 알파벳 대소문자 여부를 확인하는 isUpperLower()메소드를 따로 구현하는 대신
분기문을 바로 지정하여 대/소문자 변환을 진행한다.
코드가 효율적으로 단축된다.
'코딩테스트 - 프로그래머스 > Lv. 0' 카테고리의 다른 글
[6] JAVA 덧셈식 출력하기 (0) | 2023.11.14 |
---|---|
[5] JAVA 특수문자 출력하기 (0) | 2023.11.14 |
[3] JAVA 문자열 반복해서 출력하기 (1) | 2023.11.13 |
[2] JAVA a와 b 출력하기 (0) | 2023.11.13 |
[1] JAVA 문자열 출력하기 - 공백 제거 (1) | 2023.11.13 |