자료구조와 알고리듬 With Java/[인프런] Algorithm

Chapter 01. String (문자열)

계란💕 2022. 4. 9. 18:14

2. 대소문자 변환

<hide/>
import java.util.Scanner;
public class Change {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String str = scan.next();	
		System.out.println(solution(str));
	}
    
	public  static String solution(String str) {
		
		String answer = "";
		for( char x : str.toCharArray()) {
			if ( Character.isLowerCase(x)  ) {
				answer += Character.toUpperCase(x);
			}else {
				answer += Character.toLowerCase(x);
			}
		}
		return answer;
	}
}

 

 

3. 문장 속 단어

<hide/>
import java.util.Scanner;
public class WordInSentence {
	public static void main(String[] args) {
		WordInSentence  T = new WordInSentence ();
		Scanner scan = new Scanner(System.in);
		String str = scan.nextLine();
		System.out.println(T.solution(str));
	}
    
	public String solution(String str) {
		String answer = "";
		int m = Integer.MIN_VALUE;
		String [] s = str.split(" ");
		for(String x : s) {
			int len = x.length();
			if(len > m){
				 m = len;
				 answer = x;
			}			
		}
		return answer;
	}
}

  Note) 실행결과

  - 한 줄로 입력받기위해 "nextLine"

  - int m = Integer.MAX_VALUE;

  - String [] s= str.split(" ");  String str에 대해 공백을 기준으로 여러가지 문자열로 이루어진 배열 s를 새로 만든다.

  - str.indexOf(' ') != -1 ..... 공백을 발견하지 못하면 -1이 리턴.

  - substr을 이용할 때는 반복문에서 앞 부터 탐색하므로 if  (len > m) 에서 등호가 아닌 부등호를 사용해야한다.

    -> 최대 길이 단어가 2개 이상일 때, 가장 앞에있는 단어를 리턴해야하기 때문이다.

 

 

4. 단어 뒤집기

<hide/>
import java.util.*;
public class Main {
  public static void main(String[] args){
   	Main T = new Main();
    Scanner in=new Scanner(System.in);
    int n = in.nextInt();
    String [] str = new String[n];	// 크기가 n인 배열 str을 만든다.
    
    for(int i= 0 ; i < n; ++i){
    	str[i] = in.next();
    }
    for(String x : T.solution(n, str)){
    	System.out.println(x);
    }
    return ;
  }
  
  public ArrayList<String> solution(int n, String [] str){
  
    ArrayList<String> answer = new ArrayList<>();
    
    for(String x : str){
    	
      String tmp = new StringBuilder(x).reverse().toString();	
      // x라는 단어마다 StringBuilder 객체로 만든다.
      // StringBuilder가 지원하는 메서드인 reverse(), toString()를 이용한다.
      
      answer.add(tmp);
      // arrayList에 추가할 때, add() 이용한다.
    }
    return answer;
  }
}

 

 

5. 특정 문자 뒤집기

<hide/>
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(!Character.isAlphabetic(s[lt])) lt++;
			else if(!Character.isAlphabetic(s[rt])) rt--;	
            // s[lt], s[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 kb = new Scanner(System.in);
		String str=kb.next();
		System.out.println(T.solution(str));
	}
}

  Note)

  - Character클래스의 isAlphabetic() 메서드를 이용한다.

  - String.valueOf(s) : Char 배열 s를 String으로 바꾼다.

 

 

6. 중복문자제거

<hide/>
import java.util.Scanner;
public class Main {
  public static void main(String[] args){
   	Main T = new Main();
    Scanner in=new Scanner(System.in);
    String str = in.next();
    System.out.println(T.solution(str));
    return ;
  }
  
  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;
  }
}

  Note) 

  - str.indexOf()는 문자가 발견된 가장 첫번째의 인덱스를 리턴한다.

  - str. indexOf( str.charAt(i) ) == i : str.indexOf() 의 값과 index가 같을 때만 출력?

 

 

7. 회문 문자열

<hide/>
import java.util.Scanner;
public class Main {
  public static void main(String[] args){
    Main T = new Main();
    Scanner in=new Scanner(System.in);
    String str = in.next();
    System.out.println(T.solution(str));
    return ;
  }
  
  public String solution(String str){
    str = str.toLowerCase();
    for(int i = 0; i < str.length() / 2 ; ++i ){
      char [] c = str.toCharArray();
      if(  c[i] !=  c[str.length() - i - 1]) return "NO";
    }
    return "YES";
  }
}
<hide/>
import java.util.Scanner;
public class Main {
  public static void main(String[] args){
   	Main T = new Main();
    Scanner in=new Scanner(System.in);
    String str = in.next();
    System.out.println(T.solution(str));
    return ;
  }
  
  public String solution(String str){
   	String answer = "NO";
    String tmp = new StringBuilder(str).reverse().toString();
    if(str.equalsIgnoreCase(tmp)) answer = "YES";
  	return answer;
  }
}

  Note) 

  - char배열로 안 바꾸고 str.charAt(i) != str.charAt(len -i - 1) 라고 표현할 수도 있다.

  - StrinBuilder을 이용할 수도 있다.

    -> String tmp =  new StringBuilder(str).reverse().toStrign()

    ->  str.equalsIgnoreCase(tmp) : str과 tmp에 대해서 대소문자 구분없이 비교한다.

 

 

8. 유효한 팰린드룸

<hide/>
import java.util.Scanner;
public class Main {
  
  public static void main(String[] args){
    Scanner in=new Scanner(System.in);
    Main T = new Main();
    String str = in.nextLine();
    System.out.println(T.solution(str));
    return ;
  }
  
	public String solution(String str){
   		String answer = "NO";
      	str = str.toUpperCase().replaceAll("[^A-Z]" , "");
      	String tmp = new StringBuilder(str).reverse().toString();
      	if(tmp.equals(str)) answer = "YES";
        return answer;
    }
}

  Note)

  - 줄 단위로 입력받기 위해 nextLine()

  - 정규식을 이용한다.

    -> str = str.toUpperCase().replaceAll( "[^A-Z]", "" )  => 영어대문자가 아닌 문자는 모두 없앤다.

 

 

9. 숫자만 추출 (ASCII 또는 String)

<hide/>
import java.util.Scanner;
public class Main {
  public static void main(String[] args){
    Main T = new Main();
    Scanner in=new Scanner(System.in);
    String s = in.next();
    System.out.println(T.solution(s));
    return ;
  }
  
  public int solution(String s){
    int answer = 0;
    for(char x : s.toCharArray()){
      if(48 <= x && x <= 57){
      		answer = answer * 10 + (x - 48);
      }
    }
  		return answer;	
  }
}

  Note)

  - 아스키 코드 48~ 57 사이에 있으면 숫자

  - answer = answer * 10 + (X - 48)

  - String으로 풀려면 Character클래스의 isDigit() 를 이용한다. 

  - String answer = ""; 에 넣은 다음

     -> return Integer.parseInt(answer) 라고 해주면 숫자로 바뀐다.

 

 

???????????????????????????????

10. 문자거리

<hide/>
import java.util.*;
public class Main {
  public static void main(String[] args){
    Scanner in = new Scanner(System.in);
   	Main T = new Main();
    String str = in.next();
    char target = in.next().charAt(0);
   	for(int x : T.solution(str, target)){
   		 System.out.print(x + " ");
    }
    return ;
  }
  
  public int[] solution(String str, char target){
  
  	int [] answer = new int[str.length()];
    int p = 1000;
    
    for(int i = 0; i < str.length() ; ++i){
    	
      if(str.charAt(i) == target ){
        p = 0;
      	answer[i] = p;      		
      }else{
      	++p;
        answer[i] = p; 
      }
    }
    p = 1000;		// 초기화
    
    for(int i = str.length() - 1; i >= 0; --i){
    	
     	if(str.charAt(i) == target )	p = 0;
        else{
        	p++;
            answer[i] = Math.min(answer[i], p);
        }  
    }
  	return answer;
  }
}

 

 

11. 문자열 압축

<hide/>
import java.util.Scanner;
public class Main {
  public static void main(String[] args){
   	Main T = new Main();
	Scanner in = new Scanner(System.in);
    String s = in.next();
    System.out.println(T.solution(s));
    return ;
  }
  
  public String solution(String s){
  	
    String answer = "";
    s += " ";	// 공백 추가
   	int cnt = 1;
    
    for(int i = 0;  i < s.length() - 1; ++i){
      if(s.charAt(i) == s.charAt(i+ 1)) ++cnt;
      else{
      	answer += s.charAt(i);
      	if(cnt > 1) answer += String.valueOf(cnt);	// toString이용해도 된다.
        cnt = 1;
      }
    }
    
    return answer;
  }
}

 

 

12. 암호 (replace(), parseInt )

<hide/>
package first;
import java.util.*;
public class Replace {

	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in);
		Replace T = new Replace();
		int n = scan.nextInt();
		String str = scan.next();
		System.out.printf( T.solution(n, str));
	}
	
	public String solution(int n, String s) {
		
		String answer = "";
		for(int i = 0; i < n; ++i) {
			String tmp = s.substring(0, 7).replace("#", "1").replace("*", "0");
			int num = Integer.parseInt(tmp, 2);		//정수로 변환
			answer += (char) num;	// char형으로 바꿔서 넣어준다.
			s = s.substring(7);						// 7번 인덱스 앞 부분은 자른다.
		}
		return answer;
	}
}

 

  Note)

  - #은 1로 *은 0으로 바꾼다.

  - s.substring(7) : String의 7번인덱스부터 끝까지

  - s.substring(0, 7).replace("#", "1").replace("*", "0").

    -> replace메서드를 겹쳐 쓸 수 있다. 

  - int num = Integer.parseInt(tmp, 2) 을 통해 이진수 형태로 변환한다. 

  - num을 char형으로 바꿔서 answer에 하나씩 넣어준다.