https://www.acmicpc.net/problem/2744

 

2744번: 대소문자 바꾸기

영어 소문자와 대문자로 이루어진 단어를 입력받은 뒤, 대문자는 소문자로, 소문자는 대문자로 바꾸어 출력하는 프로그램을 작성하시오.

www.acmicpc.net

 

문제를 풀기에 앞서 ASCII Code에 대해서 필요한 정보를 정리하고 넘어가자.

간단하게 char에 해당되는 정수 값이 존재한다고 생각하면 된다.

예를 들어, 문자 A의 ASCII Code 값은 65이다.

아래 테이블을 참고하자.

 

 

중요한건, 문제를 풀 때, 각 문자에 해당되는  ASCII Code 값을 알아야하는 게 아니라는 것이다.

어떻게 활용하면 되는가?

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package String;
 
public class StringClass {
    
    public static void main(String[] args) {
        
        // ASCII Code값을 char 변수에 넣으면, 그 변수에 ASCII Code값에 해당하는 문자가 저장된다.
        char x = 65;
        System.out.println(x); // A
        
        // 문자끼리 연산이 가능 -> 문자 사이의 간격만큼 결과가 나타남
        int n = 'Z' - 'A';
        System.out.println(n); // 25 -- A는 1번째, Z는 26번째 문자니까
        
        // char와 int 사이에 연산이 가능
        System.out.println(x + 25); // 90
        
        // 문자끼리 대소비교가 가능(ASCII Code 값으로 대소비교)
        System.out.println('A' < 'Z'); // true
        
        // Casting
        // char를 int로 형변환 가능(ASCII Code 값 저장)
        System.out.println((int)x); // 65
        
        // int를 char로 형변환 가능(ASCII Code 값이 해당 int 값인 char이 반환)
        System.out.println((char)(x + 25)); // Z (ASCII Code값이 90)
    }
}
 
cs

 

이를 활용하여 간단하게 대소문자를 변환해보자.

중요한 생각은 A와 Z 사이의 간격은 a와 z 사이의 간격과 같다는 것!

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package String;
 
public class StringClass {
    
    public static void main(String[] args) {
        
        String str = "AbCdEf";
        for (int i = 0; i < str.length(); i++) {
            // 대문자의 경우!
            if('A' <= str.charAt(i) && str.charAt(i) <= 'Z') {
//                int dist = str.charAt(i) - 'A';    // A와의 간격
                System.out.print((char)('a' + str.charAt(i) - 'A')); // a로부터 해당 간격만큼 떨어진 문자로!
            } 
            else {
                System.out.print((char)('A' + str.charAt(i) - 'a'));
            }
        }
    }
}
 
cs

 

AbCdEf가 aBcDeF로 변환됨을 알 수 있다.

 

이제 [BOJ] 2744. 대소문자 바꾸기 문제를 풀어보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
 
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        String answer = "";
        for (int i = 0; i < str.length(); i++) {
            if ('A' <= str.charAt(i) && str.charAt(i) <= 'Z') { // 대문자라면,
                answer += (char)('a' + str.charAt(i) - 'A');
            } else { // 소문자라면,
                answer += (char)('A' + str.charAt(i) - 'a');
            }
        }
        System.out.println(answer);
    }
 
}
cs

 

 

또는,

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        char[] arr = str.toCharArray();
        for (int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);
            if('A' <= ch && ch <= 'Z') {
                arr[i] = (char)('a' + ch - 'A');
            } else {
                arr[i] = (char)('A' + ch - 'a');
            }
            
        }
        
        System.out.println(arr);
    }
 
}
 
cs

 

끝.

 

'알고리즘 및 코테 > 자료구조 및 알고리즘' 카테고리의 다른 글

[String] 문자열(Java)  (0) 2023.03.22

String 클래스는 Java.lang 패키지로 제공되는 Java 문자열 클래스이다.

별도의 import 없이 사용이 가능한데, 아래와 같이 선언을 할 수 있다.

 

 

위 둘의 차이는 이후 알아보기로 하자.

String 클래스는 한 번 인스턴스가 생성되면 수정할 수 없다. (immutable object)

 

 

값의 변경은 불가능하지만, 새 String을 만들어 바꿀 수는 있다.

 

 

위 코드 중에서 char[]를 String으로 바꾸는 것에 주목해보자.

아래와 같이 2가지 방법으로 바꿀 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package String;
 
public class StringClass {
 
    public static void main(String[] args) {
        String str = "ABCDFFG";
        char[] temp_arr = str.toCharArray();
        System.out.println(temp_arr); // ABCDFFG
        temp_arr[4= 'E';
//        str = new String(temp_arr);
        str = String.valueOf(temp_arr);
        System.out.println(str); // ABCDEFG
    }
 
}
 
cs

 

즉, new String(char[] array) 혹은 String.valuOf(char[] array)를 이용!

 

그리고, 두 문자열이 같은지 비교하는 메서드로 equlas 메서드가 있는데, 왜 == 로는 비교를 할 수 없는지 살펴보자.

처음 String을 선언할 때 두 가지 방법이 있다는 것과 연결되는 내용이다.

 

 

두 방법의 차이는 리터럴로 선언하느냐, 인스턴스 객체를 생성하여 선언하느냐의 차이.

그 차이는 다음과 같다.

 

 

리터럴로 선언한 경우에는 두 변수가 같은 "text" 값을 가리키고 있다.

하지만, 인스턴스로 선언한 경우에는 서로 다른 객체를 생성하고 그 안에 "test"를 참조하고 있다.

따라서 아래와 같은 결과가 나타난다.

 

 

그러므로! String을 비롯한 primitive type이 아닌 경우에는 equals 메서드로 비교를 하도록 주의하자. 결국 코딩테스트를 준비하는 과정에서는 너무 당연하지만 ==  대신 equals를 써야하는 것에 주의하는 것이 중요하니까.

 

String 클래스가 제공하는 메서드들은 다양하지만, 그중 일부를 정리하자면,

 

 

 이어서 BOJ에서 문자열 관련 문제를 풀며 추가 정리하도록 하자.

 

 

+ Recent posts