Algorithm/inflearn

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

_dear 2024. 2. 6. 17:03

 

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&&ltmp<=90)||(ltmp>=97&&ltmp<=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));
	}

}