<1.5> 특정 문자 뒤집기

mutexlocking·2022년 7월 7일
0

문제
: 영어 알파벳과 특수문자의 조합으로 이루어진 문자열에 대해서,
특수문자는 본래 위치를 유지하되 영어 알파벳만 역순으로 위치시키기

위 문제의 요구사항을 "전체 문자열 중, 영어 알파벳만 색출하여 뒤집기" 로 이해하였다.
이에 따라 문제를 해결하기 위해서는 1) 영어 알파벳 색출 / 2) 문자 역순으로 뒤집기
이 두가지 방법이 필요하다고 판단하였다.

나는 위 두 가지 방법을 아래와 같은 로직으로 구현하여 코드로 작성하였다.

1) 영어 알파벳 색출

  • 일단 전체 문자열을 구성하는 각 문자 단위로 접근할 수 있어야 하므로,
    String을 char 배열로 변환시켜주는 String 클래스의 인스턴스 메서드 toCharArray() 사용
  • 이후 영어 대문자 알파벳 문자의 아스키 코드값은 65~90,
    영어 소문자 알파벳 문자의 아스키코드값은 97~122 라는 점을 이용하여
    각각의 문자 중 영어 알파벳 만을 색출

2) 문자 역순으로 뒤집기

  • 알파벳과 특수문자가 조합된 전체 문자열 중,
    알파벳만을 색출하여 별도의 char 배열에 담은 뒤
  • 그 char 배열의 역순으로 접근하여 ,
    원래 char 배열의 문자 자리에 - 문자를 그대로 대입

위 방법을 이용하여 문제를 해결하면, 처음 알파벳을 색출할 때 1번, 그리고 이후 역순 알파벳을 기존 문자열에 대입시킬 때 1번,
총 2번 탐색을 해야 하지만, 그럼에도 직관적인 해결 로직이라고 생각되어 이렇게 문제를 해결하였다.

실제 작성한 코드는 아래와 같다.

import java.util.Scanner;

public class Main {

    public static String solution(String str){

        char[] charArr = str.toCharArray();
        char[] charArr2 = new char[charArr.length];
        int idx = 0;


        //1) 일단 전체 문자열 중에서 영어 알파벳만 순서대로 추출한 후
        for (char c : charArr) {
            if( (c>=65 && c<=90) || (c>=97 && c<=122))
                charArr2[idx++] = c;

        }

        idx--; //여기서 idx값 하나를 미리 줄여줘야 - charArr2 배열에서 마지막 글자를 가리키게 된다는 점 주의!

        //2) 기존 배열의 알파벳 자리에 , 추출한 문자열을 역순으로 대입
        for(int i=0; i<charArr.length; i++){
            if((charArr[i]>=65 && charArr[i]<=90) || (charArr[i]>=97 && charArr[i]<=122))
                charArr[i] = charArr2[idx--];
        }

        return String.valueOf(charArr);

    }

    public static void main(String[] args){

        //0. Scanner 준비
        Scanner sc = new Scanner(System.in);

        //1. 문자열 입력
        String str = sc.next();

        //2. solution() 호출
        String output = solution(str);

        //3. 변환 결과 출력
        System.out.println(output);

    }
}

지금까지 문자열 주제의 문제를 풀면서,
String을 char 배열로 / char배열을 String으로 변환하는 작업이 빈번하게 발생함을 느꼈다.
따라서 이에 따른 아래 두 메서드는 잘 익혀두는게 좋을 것 같았다.
1) String을 char배열로 변환
: toCharArray() - String 클래스의 인스턴스 메서드
2) char배열을 String으로 변환
: String.valueOf() - String 클래스의 static 메서드

profile
개발자가 되고자 try 하는중

0개의 댓글