자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 1. 문자열(2)
5. 특정 문자 뒤집기
<나의 풀이>
- char형 배열로 변경 후 lt=0, rt=문자열길이-1 좌표로 시작하여 이동하며 알파벳일때 동시에 자리 변경
- 이동한 lt, rt의 자리가 특수문자 일 경우, 다음 알파벳 만날 때까지 좌표이동
package inflearn_java;
import java.util.Scanner;
public class Ex1_5 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
String s= sc.nextLine();
int lt= 0;
int rt= s.length()-1;
char[] cArray= s.toCharArray();
while(lt<rt) {
char ltmp= cArray[lt];
char rtmp= cArray[rt];
if((ltmp>=65&<mp<=90)||(ltmp>=97&<mp<=122)) {
if((rtmp>=65&&rtmp<=90)||(rtmp>=97&&rtmp<=122)) {
//알파벳
cArray[lt]=rtmp;
cArray[rt]=ltmp;
lt++;
rt--;
}else {
rt--;
}
}else {
lt++;
}
}
System.out.println(String.valueOf(cArray));
}
}
<해설>
- Character.isAlphabetic() : 알파벳이면 true, 아니면 false반환
package inflearn_java;
import java.util.Scanner;
public class Ex1_5_answer {
public String solution(String str) {
String answer="";
char[] s=str.toCharArray();
int lt=0, rt=str.length()-1;
while(lt<rt) {
if(!Character.isAlphabetic(s[lt])) {
lt++;
}else if(!Character.isAlphabetic(s[rt])) {
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) {
// TODO Auto-generated method stub
Ex1_5_answer T = new Ex1_5_answer();
Scanner kb = new Scanner(System.in);
String str=kb.next();
System.out.println(T.solution(str));
}
}
6. 중복문자제거
<나의 풀이>
- HashMap 을 사용하여 Map 형 변수를 하나 생성
- 문자열에서 문자를 하나씩 가져와서 해당 Map에 있는지 확인한 후 없으면 index값(정수)과 해당 문자를 하나씩 저장
package inflearn_java;
import java.util.HashMap;
import java.util.Scanner;
public class Ex1_6 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
String str= sc.nextLine();
HashMap<Integer,Character> arr = new HashMap<>();
int i=0;
for(char c:str.toCharArray()) {
if(!arr.containsValue(c)) {
arr.put(i, c);
i++;
}
}
StringBuilder sb= new StringBuilder();
for(int j:arr.keySet()) {
sb.append(arr.get(j));
}
System.out.println(sb.toString());
}
}
<해설>
- 문자열.indexOf('문자'): 문자열에서 해당 문자가 발견되는 첫번째 index
- 문자열의 첫번째 index부터 시작하여 현재 index와 그 문자를 indexOf 로 찾은 index가 같으면 저장
package inflearn_java;
import java.util.Scanner;
public class Ex1_6_answer {
public String solution(String str) {
String answer="";
for(int i=0;i<str.length();i++) {
if(str.indexOf(str.charAt(i))==i) {
answer+=str.charAt(i);
}
}
return answer;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Ex1_6_answer T = new Ex1_6_answer();
Scanner kb = new Scanner(System.in);
String str=kb.next();
System.out.println(T.solution(str));
}
}
7. 회문 문자열
<나의 풀이>
- 대소문자 구분=> 전체 소문자로 변경(대문자도 가능), 하나로 통일하기 !!
- 원래의 문자열과 StringBuilder를 통해 reverse한 문자열과 같으면 "YES", 아니면 "NO" 출력
package inflearn_java;
import java.util.Scanner;
public class Ex1_7 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
String str= sc.nextLine().toLowerCase();
StringBuilder sb= new StringBuilder(str);
String revStr= sb.reverse().toString();
System.out.println(str.equals(revStr)?"YES":"NO");
}
}
<해설>
- 문자열의 전체길이 절반까지만 확인하면 된다.(i<len/2)
import java.util.Scanner;
public class Main {
public String solution(String str) {
String answer="YES"; //회문이면
int len=str.length();
str=str.toUpperCase(); //전체 대문자변경
for(int i=0;i<len/2;i++) {
if(str.charAt(i)!=str.charAt(len-i-1)) {
answer="NO";
break; //하나라도 다르면 바로 나오기
}
}
return answer;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Main T = new Main();
Scanner kb = new Scanner(System.in);
String str=kb.nextLine();
System.out.println(T.solution(str));
}
}
8. 유효한 팰린드롬
<나의 풀이>
- str로 문자열을 입력 받아, 대소문자 영어만 남겨진 문자열 nStr을 새로 생성
- nStr을 전체 소문자로 변경(대소문자 구분X)
- lt, rt로 각각 끝부분 index를 지정하여 한칸씩 동일한지 비교, 다르면 break
package inflearn_java;
import java.util.Scanner;
public class Ex1_8 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
String str= sc.nextLine();
String nStr="";
for(char c:str.toCharArray()) {
if((c>=65&&c<=90)||(c>=97&&c<=122)) {
nStr+=c;
}
}
int lt=0;
int rt=nStr.length()-1;
char[] cArr=nStr.toLowerCase().toCharArray();
boolean isOff=false;
while(lt<rt) {
if(cArr[lt]!=cArr[rt]) {
isOff=true;
break;
}else {
lt++;
rt--;
}
}
System.out.println(isOff?"NO":"YES");
}
}
<해설>
- 문자열.replaceAll("문자열1","문자열2"):해당 문자열1을 전부 문자열2로 변경(표현식 사용가능)
import java.util.Scanner;
public class Main {
public String solution(String s) {
String answer="NO";
s=s.toUpperCase().replaceAll("[^A-Z]","");
String tmp= new StringBuilder(s).reverse().toString();
if(s.equals(tmp)) answer="YES";
return answer;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Main T = new Main();
Scanner kb = new Scanner(System.in);
String str=kb.nextLine();
System.out.println(T.solution(str));
}
}