강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

Solioquies님의 프로필 이미지
Solioquies

작성한 질문수

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

5. 특정 문자 뒤집기(toCharArray())

안녕하세요 질문입니다.

작성

·

189

0

import java.util.*;
class Main {	
	public String solution(String str){
		String answer;
		char[] s=str.toCharArray();
		int lt=0, rt=str.length()-1;
		while(lt<rt){
			if(!((s[lt])>=97 && (s[lt])<=122 )||(s[lt])>=65 && (s[lt])<=90 ) lt++;
			else if(!((s[rt])>=65 && (s[rt])<=90 )||(s[rt])>=97 && (s[rt])<=122) rt--;
			else{
				char tmp=s[lt];
				s[lt]=s[rt];
				s[rt]=tmp;
				lt++;
				rt--;
			}
		}
		answer=String.valueOf(s);
		return answer;
	}

	public static void main(String[] args){
		Main T = new Main();
		Scanner sc = new Scanner(System.in);
		String str=sc.next();
		System.out.println(T.solution(str));
	}
}

//a#b!GE*T@S

아스키 코드 이용해서 풀려했는데 GE 부분이 안 바뀌더라구요. 혹시 뭐가 문제일까요.. G에서 바로 다음인 E로 넘어가던데..

답변 1

4

안녕하세요, 지나가던 학생입니다.

결론부터 말씀드리자면, if와 else if의 조건식이 잘못되었습니다.
문제에서 문자가 알파벳 대문자, 알파벳 소문자와 상관 없이 영어 알파벳인 경우에만 뒤집으라고 했기 때문에, 실제로 문자를 뒤집는 로직을 수행하는 else 조건으로 가기 위해선 if, else if에
'해당 문자가 알파벳 소문자도 알파벳 대문자도 아닌, 즉 특수문자인지를 판별'하는 조건식을 작성해야 합니다.

지정하신 조건을 보면,

if(!((s[lt])>=97 && (s[lt])<=122 )||(s[lt])>=65 && (s[lt])<=90 ) lt++;
-> s[lt]가 알파벳 소문자아닌(= 대문자 또는 특수문자) 또는 알파벳 대문자인 경우

else if(!((s[rt])>=65 && (s[rt])<=90 )||(s[rt])>=97 && (s[rt])<=122) rt--;
-> s[rt]가 알파벳 대문자아닌(= 소문자 또는 특수문자) 또는 알파벳 소문자인 경우

해당 조건 및 문자열이 'a#b!GE*T@S'인 경우, 루프를 진행하다가 s[lt]가 G, s[rt]가 E가 됐을 때
s[lt]가 알파벳 대문자이므로 위의 if 조건식을 만족하기 때문에 문자가 뒤집히지 않습니다.

따라서 각 문자가 알파벳 소문자도 아니고 알파벳 대문자도 아닌지를 확인하기 위한 조건식을 입력하면 다음과 같습니다.

!(s[lt] >= 97 && s[lt] <= 122) && !(s[lt] >= 65 && s[lt] <= 90)
((s[lt] 또는 s[rt]가) 알파벳 소문자아니다 그리고 알파벳 대문자아니다)

저도 막 공부하는 입장이라 허접하지만 도움이 되었으면 좋겠습니다.

Solioquies님의 프로필 이미지
Solioquies
질문자

감사합니다.

Solioquies님의 프로필 이미지
Solioquies

작성한 질문수

질문하기