알고리즘

[문자열] 문자 찾기 & 대소문자 변환 & 문장 속 단어찾기(indexOf(), substring())

날아 2023. 3. 22. 13:23

Q. 해당 특정문자가 입력받은 문자열에 몇 개 존재하는지 알아내시오.

대소문자를 구분하지 않는다. 

 

Class Main {
	public int solution(String str, char t){
    	int answer = 0;
        
        str = str.toUpperCase(); // 대소문자를 구분하지 않음. 모두 대문자가 된다.
        t = Character.toUpperCase(t); //대문자가 된다. 
        
        /*for(int i=0; i<str.length(); i++){
        	if(str.charAt(i)==t)
            answer++;
        }*/
        
        /*향상된 for문 ver.*/
        for(char x : str.toCharArray()) { //문자배열객체를 생성
        	if(x==t) answer++;
        }
        
        return answer;
    }
    
    public static void main(String[] args){
    	Main T = new Main(); //인스턴스 메서드라 객체 생성 
        Scanner kb = new Scanner(System.in);
        String str = kb.next(); //next는 콘솔창에서 문자열을 하나 읽어들임
	char t = kb.next().charAt(0); //문자 한개를 읽어들임
        
        System.out.print(T.solution(str, t));
    }
}

 

  • 대소문자를 구분하지 않기때문에 모두 대문자화 하였다. String.toUpperCase() / Character.toUpperCase()
  • 향상된 for문에는 String이 올 수 없다. 배열이나 Array, ArrayList가 올 수 있다. 따라서 문자열을 기준으로 문자배열객체를 생성해주는 메서드를 사용하였다. String.toCharArray()

Q. 대문자는 소문자로, 소문자는 대문자로 바꾸어라 

Class Main {
	public int solution(String str){
    	String answer = "";
        
        for(char x : str.toCharArray()){
        	/* if(Character.isLowerCase(x)){
            		answer += Character.toUpperCase(x);
                } else {
           		answer += Character.toLowerCase(x);
           	}*/
            
            /*아스키 넘버로도 구현 가능
            대문자는 65~90
            소문자는 97~122
            대소문자 변환은 소문자에서 32를 빼면 대문자가 된다.*/
            if(97<=x && x<=122){
            	answer += (char)(x-32); //형변환 필수!
            } else {
            	answer += (char)(x+32);
            }
        }
        return answer;
    }
    
    public static void main(String[] args){
    	Main T = new Main(); 
        Scanner kb = new Scanner(System.in);
        String str = kb.next(); 
        
        System.out.print(T.solution(str));
    }
}

 

  • 문자열 x가 소문자일때와 대문자일때를 나누어서 각각 반대 문자로 바꿔주는 메서드를 사용하였다.              Character.toUpperCase() / Character.toLoswerCase()
  • 아스키 문자로도 구현할 수 있다. 대문자는 65~90 소문자는 97~122 대문자와 소문자의 차이는 32이다.

Q. 한 개의 문장 속에서 가장 긴 단어를 출력하시오.

단, 가장 길이가 긴 단어가 여러개일 경우 문장 속에서 가장 앞쪽에 위치한 단어를 답으로 한다. 

 

Class Main {
	public int solution(String str){
    	String answer = "";
        int max = Integer.MIN_VALUE; //Integer의 가장 작은 값으로 초기화 
        /*String[] s = str.split(" "); //띄어쓰기를 기준으로 단어를 자른다. 
        
        for(String x : s) {
        	int len = x.length();
            if(len > max) {
            	m = len;
                answer = x;
            }*/
            
        /*indexOf(), substring() 사용 */
        int pos;
        
        while(((pos = str.indexOf(' ')) != -1) { //indexOf()가 ' ' 를 발견하지 못하면 -1를 반환한다.
        //발견할 경우 index위치를 반환한다. 첫번째 pos는 index(2)를 가리킨다. 
        	String tmp = str.substring(0, pos);
            int len = tmp.length();
            if(len > max) {
            	max = len;
                answer = tmp;
             }
             str = str.substring(pos+1);
        }
        
        if(str.length() > m) {
        	answer = str;
        }
        
        return answer;
    }
    
    public static void main(String[] args){
    	Main T = new Main(); 
        Scanner kb = new Scanner(System.in);
        String str = kb.nextLine(); //문장을 입력받아야할 때는 nextLine()으로 받는다. 
        
        System.out.print(T.solution(str));
    }
}

 

  • int max = Integer.MIN_VALUE; 
  • indexOf() :  특정 문자열의 위치를 알려주는 메서드
  • substring() : 특정 문자열의 위치를 기준으로 문자열을 자른다.  
  • str = str.substring(pos+1); : 다음 문자열로 옮겨주기 위해서
  • if(str.length() > m) { answer = str;} : 마지막 str은 그 뒤에 빈칸이 없기 때문에 indexOf가 -1를 반환해서 카운트되지 않는다. 따라서 마지막 단어는 따로 구해줘야한다.