알고리즘, 코딩테스트/알고리즘 풀이

[프로그래머스/ 코딩테스트 연습문제] 이상한 문자 만들기

jiyoon0000 2024. 11. 26. 11:47

Q. 이상한 문자 만들기

A1

class Solution {
    public String solution(String s) {
        StringBuilder answer = new StringBuilder();
        int start = 0;
        
        //문자열을 처음부터 끝까지 for문 반복으로 확인
        for(int i=0; i<=s.length(); i++){
        	//만약 해당 문자가 문자열의 끝이거나, 공백일 경우
            if(i == s.length() || s.charAt(i) == ' '){
            	//단어 처리
                for(int j = start; j < i; j ++){
                    char c = s.charAt(j);
                    //단어 내 짝수 인덱스 일 경우 -> 대문자
                    if((j-start) % 2 == 0){
                        answer.append(Character.toUpperCase(c));
                    //단어 내 홀수 인덱스 일 경우 -> 소문자
                    }else {
                        answer.append(Character.toLowerCase(c));
                    }
                }
                //공백 추가(마지막 단어 제외)
                if(i != s.length()){
                    answer.append(" ");
                }
                
                //다음 단어 시작 위치 업데이트
                start = i +1;
            }
        }
        //StringBuilder에 쌓인 내용을 최종적으로 String 객체로 변환하여 반환
        return answer.toString();
    }
}

 

A2

class Solution {
    public String solution(String s) {
    	//입력 문자열을 공백 기준으로 나눔
        //-1을 추가로 설정하여 공백만 있는 부분도 배열에 포함되도록 함
        String[] words = s.split(" ", -1);
        StringBuilder answer = new StringBuilder();
        
        //단어 배열을 돌며 각각의 단어를 처리
        for(int i=0; i<words.length; i++){
        	//현재 단어를 가져옴
            String word = words[i];
            //변환된 단어를 저장할 StringBuilder 생성
            StringBuilder trans = new StringBuilder();
                        
            //현재 단어의 각 문자를 순회
            for(int j=0; j<word.length(); j++){
                char c = word.charAt(j);
                //j번째 문자가 짝수 인덱스면 대문자, 홀수 인덱스면 소문자
                if(j%2 == 0){
                    trans.append(Character.toUpperCase(c)); //대문자
                }else{
                    trans.append(Character.toLowerCase(c)); //소문자
                }
            }
            
            //변환된 단어를 answer에 추가
            answer.append(trans);
            
            //마지막 단어가 아닌 경우에만 공백 추가
            if(i != words.length-1){
            	//단어 사이에 공백을 추가
                answer.append(" ");
            }
        }
        return answer.toString();
    }
}

 


-중첩 조건문이 너무 많이 사용되서 줄일 수 있는 방법을 찾다가 split 발견

*StringBuilder

-가변 객체

-문자열을 수정하거나 추가할 때 내부 배열을 직접 변경하므로 메모리와 성능 면에서 효율적

-문자열이 수정될 때 새로운 객체를 생성하지 않는다. (String을 사용하면 매번 새로운 객체가 생성된다.)

-append를 호출하면 기존 StringBuilder 객체에 값이 추가된다.

-기능

  • append : 문자열 추가
  • insert : 특정 위치에 문자열 삽입
  • replace : 문자열 교체
  • delete : 문자열 삭제
  • reverse : 문자열 뒤집기

-반복문 안에서 문자열을 반복적으로 조작해야하는 경우 사용하는 것이 좋음

-코드가 효율적이고 실행속도가 빨라짐

 

*split( ) 

-입력 문자열을 공백으로 나눈다.

-split() 메서드에 -1을 추가하면 연속된 공백이나 마지막 공백도 배열에 포함된다.