2 minute read


Input-1
“AB”
Output-1
“BC”

Input-2
“a B z”
Output-2
“b C a”

문제 풀이

주어진 문자열에서 대소문자 알파벳을 하나씩 앞으로 밀어낸 알파벳을 찾아야 한다.

먼저 아래의 조건을 검증해보자.

  • 주어진 문자열 중에서 공백값은 밀어내지 않고 그대로 담는다.
  • 주어진 문자열 중에서 대소문자를 구분한다. // ascii code의 경우 65~90이 대문자, 97~122가 소문자
  • 대문자 ‘Z’나 소문자 ‘z’의 범위를 초과했을 경우 ‘A’, ‘a’부터 n만큼 밀어낸다.

공백값일 경우는 밀어낼 필요가 없기에 그대로 담는다.

1
2
3
4
answer = "";
if((char)asc != ' ') {
// 생략
}else answer += ' ';

대소문자를 구분할 boolean 변수를 생성하여 소문자일 경우에만 false로 변경하자.
반복문을 한바퀴씩 순회할 때마다 다시 true로 변경하여 다시 검증할 수 있도록 작성하였다.

1
2
3
4
5
boolean alph = true;
for(int i=0; i<s.length(); i++) {
    if('z' >= (char)asc && (char)asc >= 'a') alph = false;
    alph = true;
}

대문자 ‘Z’의 범위(asc > 122)를 초과했을 경우 ‘A’로 돌아가서 n만큼 밀어내고
소문자 ‘z’의 범위(asc > 90)를 초과했을 경우 ‘a’로 돌아가서 n만큼 밀어내면 된다.
초과하지 않았을 경우는 그냥 n만큼 밀어낸 알파벳을 담으면 된다.

1
2
3
4
5
if((char)asc != ' ') {
    if(alph == true && (asc+n) > 90) answer += (char)(asc - 91 + n + 65); // 대문자 Z 넘어갈 경우
    else if(alph == false && (asc+n) > 122) answer += (char)(asc - 123 + n + 97); // 소문자 z 넘어갈 경우
    else answer += (char)(asc + n);
}


작성코드

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
import java.util.*;

class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        int n = sc.nextInt();
        solution(s, n);
    }

    public static String solution(String s, int n) {
        int asc = 0;
        String answer = "";
        boolean alph = true;
        for(int i=0; i<s.length(); i++) {
            asc = (int)(s.charAt(i));
            if('z' >= (char)asc && (char)asc >= 'a') alph = false;
            if((char)asc != ' ') {
                if(alph == true && (asc+n) > 90) answer += (char)(asc - 91 + n + 65);
                else if(alph == false && (asc+n) > 122) answer += (char)(asc - 123 + n + 97);
                else answer += (char)(asc + n);
            }
            else answer += ' ';
            alph = true;
        }
        return answer;
    }
}

회고

  • char형 변환을 다루어 ascii code 로 변환하여 정수형으로 알파벳을 계산하는 방식에 어느정도 익숙해지고 어떤 로직으로 구성해야 할지 조금 감이 잡힌 것 같다.