띠오니 개발자 성장일지
article thumbnail
반응형

인프런의 "자바(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()));
    }
}

 

 

💪🏻 보완하고 싶은 점

  1. 코딩 테스트라는게 어떻게하든 답을 제출해서 컴파일 성공하면 되긴 하지만, 기본으로 적혀진 String answer = "" 과 같은 변수도 활용하는 게 좋을 것 같다. 그 들이(?) 원하는 답이 될 변수니까!
  2. 처음에는 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만큼 차이나는 것을 통해 대소문자 변경이 가능하다.

 

 

 

 


 

 

 

반응형
profile

띠오니 개발자 성장일지

@띠오니

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!