coding test/programmers

[Programmers] 이상한 문자 만들기(JAVA)-Level 1

쥬냥냥 2022. 8. 9. 12:01

< 문제 설명 >

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.


< 제한 조건 >

  • 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
  • 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.

< 코드 및 풀이 >

*Programmers에서도 정확성 테스트 통과, eclipes에서 수,박을 반복 원하는 수를 입력 받아 결과를 출력한 코드

1. " "문자의 공백 칸이 있을 경우 0번째 인덱스로 돌아가며 짝수일 경우 대문자, 홀수 일 경우 소문자로 변환하면 되는 간단한 문제이다. 우선 배열의 idx를 통해 idx의 수가 짝수 인지 홀수 인지에 따라 문자를 바꿀 생각으로 split을 통해 전체 문자를 잘라서 배열 str에 넣어주고 .equals를 통해 띄어쓰기가 있을 경우 0으로 변경, toUpperCase와  toLowerCase를 통해 각각 대문자 소문자 처리를 해줘 이를 answer이라는 문자열로 붙여주는 방식으로 풀었다.

import java.util.*;
public class Strangeword {
	
	public static String solution(String s) {
        String answer = "";
        String[] str = s.split(""); //문자열 한 글자씩 잘라 넣기
        
        int idx = 0;
        for(int i=0; i<str.length; i++) {
            if(str[i].equals(" ")) { //띄어쓰기 있으면 idx 0 설정
                idx = 0;
            } else if(idx % 2 == 0) {
                str[i] = str[i].toUpperCase(); // 짝수 번째 글자면 대문자 
                idx++;
            } else if(idx % 2 != 0) {
                str[i] = str[i].toLowerCase(); // 홀수 번째 글자면 소문자
                idx++;
            }
            answer += str[i];
        } 
        
        return answer;
    }
	
	
	public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);

	System.out.print("문자를 입력하세요");
	String s = sc.nextLine();
	
	System.out.print("변환된 문자는 : "+solution(s)+" 입니다.");

	
	}
}

 

 

2. 삼항 연산자와 문자열에 포함여부를 확인하는 contains를 통해 간단히 정리한 식이다. 여기서 만약 " "가 포함된다면

idx를 0으로 초기화 아니라면 +1을 해주고 +1된 값을 다시 삼항 연산자로 비교하니 즉 원래 짝수인 인덱스가 홀수인

인덱스로 변했다는걸 인지해 2로 나눴을때 나머지가 없으면 소문자 변환, 있으면 대문자 변환을 해줬다.

public static String solution(String s) {
	        String answer = "";
	        String[] str = s.split("");
	        int idx=0;
	        
	        for(String i:str) {
	        	idx = i.contains(" ")?0:idx+1; //공백이면 0, 아니면 +1이니 여기서는 대문자가 홀수로 설정
	        	answer += idx%2 ==0 ? i.toLowerCase():i.toUpperCase();
	        }
	        return answer;
	    }

<실행화면>


<알게 된 사실 & 중요한 점>

기본적으로 1번의 방식으로 풀 때는 단순히 빈공간일땐 0으로 초기화, 짝수 대문자, 홀수 소문자라는 이 키워드를 가지고 

문제를 푸니 쉽게 풀었다. 하지만 좀 더 공부하며 삼항 연산자와 문자열을 비교해주는 함수를 통해 코드를 간결하게 

줄일 수 있는 법을 알고 이를 실제로 해보니 알고리즘을 생각해 문제를 푸는 것 뿐아니라 그 코드를 최대한 간결하게

표현할 수 있는 능력과 지식도 중요하겠다는 생각이 들었다.


1. 변수명.split("자를 기준") -> 입력받은 정규표현식 or 특정 문자를 기준으로 문자열을 나누어 배열에 저장하는 함수

 

2. 내용 비교 하는 법

    - 변수명.equals("내용") -> 객체끼리 같은 내용을 포함하는지 비교하는 메소드

      ( equals는 ==과 다르게 대상의 내용 자체를 비교한다.)

    - 문자열.contains("내용")-> 대상 문자열에 특정 문자열이 포함되어 있는지 확인하는 함수

      (대/소문자 구분한다)

 

3. .toUpper(LowerCase) -> 해당 문자를 대, 소문자 전환

 

4. 삼항연산자 

    - 조건식(피연산자1) ? 피연산자2 : 피연산자3

     (조건식이 참(true) 이면, 삼항 연산자 결과는 피연산자2 가 되고,

      조건식이 거짓(false) 이면, 삼항 연산자 결과는 피연산자3을 return)