뽀미의 개발노트

인프런 1-2. 대소문자 변환 (자바) 본문

Algorithm_Test

인프런 1-2. 대소문자 변환 (자바)

산타는 뽀미 2023. 9. 4. 23:21

[문제]

대문자와 소문자가 같이 존재하는 문자열을 입력받아 대문자는 소문자로 소문자는 대문자로 변환하여 출력하는 프로그램을 작성하세요.


[입력]

첫 줄에 문자열이 입력된다. 문자열의 길이는 100을 넘지 않습니다.
문자열은 영어 알파벳으로만 구성되어 있습니다.


[출력]

첫 줄에 대문자는 소문자로, 소문자는 대문자로 변환된 문자열을 출력합니다.



[문제 해결 과정]

이거는 아까 했던거랑 비슷할 것 같다!
아까 검색했을때 대소문자 변환하는거 말고도 대문자인지 소문자인지
확인하는 함수도 있었던 것 같은데 그냥 향상된 반복문으로
반복문 돌려서 대문자면 소문자로, 소문자면 대문자로 바꾸면 되는거 아닌가??

1. 문자열을 입력받는다.
2. 그 문자열을 배열에 담아 반복문을 돌린다.
3. 문자 하나하나 isUpperCase()로 대문자인지 확인하고
맞으면 toLowerCase()로 소문자로 바꾼다!
반대는 반대로 해주면 됨.

근데 저건 다 String에 쓰는 함수들임..
char에 쓰려면 Character.toLowerCase(단어)이렇게 써줘야함..

그리고 바꾼 단어로 넣었다고 해도
str을 출력해도 그렇고 str.toCharArray()를 출력해도 그렇고
안 바뀐 문자열이 나옴

그래서 미리 arraylist를 생성하고
대 -> 소 또는 소 -> 대로 문자 변환한후 그 리스트에 담겠음.
그리고 리스트를 그냥 출력하면 대괄호도 있고 문자가 쉼표로 구분되서 나오므로
리스트 안에 있는걸 문자열로 합쳐서 출력해야함!!
그래서 StringBuilder를 이용해서 향상된 for문에서 리스트속 문자 하나한
스트링빌더로 이어붙여줬음!!

[처음으로 풀어서 통과한 코드]

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
	
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
	    String str = sc.nextLine();
	    
	    List<Character> arr = new ArrayList<>(); // 변환한 char 담을 리스트
	    
	    for(char x : str.toCharArray()) {
	    	if(Character.isUpperCase(x)) {
	    		x = Character.toLowerCase(x);
	    	} else {
	    		x = Character.toUpperCase(x);
	    	}
	    	arr.add(x);
	    	// 변환한 뒤 리스트에 담기
	    }
	    
	    StringBuilder sb = new StringBuilder(); // 스트링빌더 이용
	    
	    for(Character ch : arr) {
	    	sb.append(ch); // 리스트 속 char를 하나의 문자열로 엮기
	    }
	    
	    System.out.println(sb.toString());
	}
}



강의 듣고 난후
그냥 String answer = ""라고 한 후
문자 변환 한후 answer에다가 더해주기만 하면 되는 거였음!!!;;;

[스트링빌더 말고 그냥 단순 덧셈;;;으로 하면 훨씬 나음]

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
	
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
	    String str = sc.nextLine();
	    
	    String answer = "";
	    
	    for(char x : str.toCharArray()) {
	    	if(Character.isUpperCase(x)) {
	    		answer += Character.toLowerCase(x);
	    	} else {
	    		answer += Character.toUpperCase(x);
	    	}
	    }
	    
	    System.out.println(answer);
	}
}


또한 아스키코드로 할 수도 있음!
대문자는 65 ~ 90
소문자는 97 ~ 122
둘의 차이는 32가 남!!
char는 뭐 숫자로 변환하고 할 것도 없이 그냥 바로
x가 65와 90 사이면~ 이라고 숫자처럼 비교해주면 대문자라고 알아먹음.
그래서 대문자면 32를 더해주고 소문자면 32를 빼줬는데
그럼 결과값은 숫자로 나와버림!!!
그럼 그냥 앞에다가 (char)만 붙여주면 됨!!

[아스키코드 사용]

import java.util.Scanner;

public class Main {
	
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
	    String str = sc.nextLine();
	    
	    String answer = "";
	    
	    for(char x : str.toCharArray()) {
	    	if(x >= 65 && x <= 90) {
	    		answer += (char)(x+32);
	    		// 65~90 사이면 대문자
	    		// 대문자에 32를 더하면 소문자됨
	    		// 숫자를 다시 문자로 형변환 해줘야됨
	    	} else {
	    		answer += (char)(x-32);
	    	}
	    }
	    System.out.println(answer);
	}
}

 

[후기]

겅부하기 싫어서 그냥 쉬운 문자열 문제 푸는중..(근데 그마저도 그렇게 쉽지도 않음;;) 일요일에 또 코테라 얼른 어려운것도 공부해야 하는데.. 귀찬타.. 내일의 나한테 맡겨야징!