-
[JAVA] 프로그래머스 이상한 문자 만들기!Algorithm 2022. 2. 1. 12:52
- 이상한 문자 만들기
문제 설명문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백 문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.
제한 사항- 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
- 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.
"try hello world" "TrY HeLlO WoRlD" "try hello world"는 세 단어 "try", "hello", "world"로 구성되어 있습니다. 각 단어의 짝수번째 문자를 대문자로, 홀수번째 문자를 소문자로 바꾸면 "TrY", "HeLlO", "WoRlD"입니다. 따라서 "TrY HeLlO WoRlD"를 리턴합니다.
public class 이상한문자 { public static void main(String[] args) { String s = "try hello world"; System.out.println(solution(s)); } public static String solution(String s) { String answer = ""; int count = 0; for(int i = 0; i < s.length(); i++){ if(Character.isWhitespace(s.charAt(i))){ count = 0; answer += " "; continue; } if(count % 2 == 0){ char c = Character.toUpperCase(s.charAt(i)); answer += c; count++; } else { answer += Character.toLowerCase(s.charAt(i)); count++; } } return answer; } }
안녕하세요 이번 포스팅은 이상한 문자열 만들기를 해결해보겠습니다 ^^
이번 문제는 꽤 재밌었는데요 처음 사용해보는 메서드도 있었습니다.
우선 문제는 특정 문자열이 주어 졌을때 0을 포함한 짝수번째의 문자열만 대문자로 바꾸고 홀수번째 문자는 소문자로 바꿔야 하는 것인데요, 제한사항을 보면 문자열 전체의 index를 사용하는 것이 아니라 공백을 기준으로 문자를 나눠서 index가 0부터 다시 시작해야 한다고 합니다.
그래서 처음 문제를 보자마자 든 생각은 split 메서드를 통해서 String 배열에 담아주고 이중 for문을 돌려야 하겠구나~~~입니다.
하지만 주변 개발자 지인 분들 혹은 같이 프로그래밍을 공부하는 동료들과 이야기를 해보면 이중 for문을 최대한 피하는 게 좋다고 하더군요. 굳이 이중 for문을 사용하지 않고도 문제를 해결할 수 있다면 다른 방법을 찾는 게 좋다는 것이죠.
원래는 String 배열에 공백을 기준으로 문자를 자른 다음에 outer for문은 배열의 길이만큼 그리고 inner for문은 각 배열 인덱스에 있는 String의 길이 만큼 반복을 하려 했습니다. 그렇게 된다면 제한사항에서 언급되어져있는 것처럼 문자열 전체의 index를 잡지 않고 각 문자의 길이 만큼 index를 초기화할 수 있기 때문이죠
하지만 굳이 그렇게 해야 하나...?라는 생각이 들어서 저는 그냥 문자열 전체의 index를 사용했습니다.
우선 문자열 전체의 길이만큼 for 문을 돌리면서 첫 번째 조건으로 공백 체크를 해줬습니다.
여기서!! 신기한 메서드를 찾았는데요 바로 Character.isWhiteSpace()라는 메서드입니다. 소괄호 안에 char타입의 문자를 넣어주면 공백 체크를 해줘서 공백이라면 true 아니면 false를 반환합니다. 굉장히 재밌는 메서드죠.
if(s.char [i]. equals(" ")) 이렇게 할 수도 있겠지만 자바에서 지원을 하는 메서드를 사용하는 게 더 좋을 것 같다는 생각이 들었고 다양한 메서드를 사용하는게 재밌었어 써봤습니다 재밌지 않나요?? ㅎㅎ
if Character is white space라는 완벽 영어문장이 만들어지기도 합니다 ㅋㅋㅋㅋ
한글로 번역하면 말 그대로 만약 문자가 비어있는 공간이라면 이렇게 조건을 잡는 거죠
아무튼 반복문을 돌리기 이전에 count라는 변수를 선언해서 공백을 만날 때마다 count를 0으로 초기화해줬습니다. 그 이유는 문제에서 요구한 것처럼 index처럼 보이는 변수를 사용해서 index를 0으로 초기화한다는 느낌으로 했습니다.
그러고 나서 String answer 에다가 공백을 += 해줬습니다.
사실 String을 += 하는 것보다는 Stringbuilder를 사용해서 append() 메서드를 사용하는 것이 더 바람직합니다.
그 이유는 속도면에서 차이가 나는데요 String은 String pool에 미리 만들어져 있는 String들을 갔다 쓰는 것이라고 알고 있습니다. 그래서 String을 += 하게 되면 이어 붙일 때마다 데이터가 저장되어있는 주소를 찾아가서 데이터를 가지고 오고 다시 새로운 주소에 할당을 하기 때문입니다. 이렇게 되면 비효율 적이고 속도가 느리겠죠??
그리고 isWhiteSpace 안의 로직을 보면 continue를 해줬는데 그 이유는 만약 비어있다면 밑의 코드를 실행시킬 필요가 없으니까 continue를 통해서 다음 반복으로 넘어가게 해 줬습니다. 만약 continue를 걸지 않는다면 밑에 코드가 실행돼서 불필요한 로직이 수행될 뿐만 아니라 어쨋든 count++을 해주기 때문에 0으로 초기화를 해주고 나서 ++을 해줘서 count는 1이 되겠죠 이러면 실행했을 때 오류가 생깁니다.
그래서 공백 체크는 다른 조건문이 수행되기 전에 첫 번째로 체크를 해줘야 합니다.
아무튼 그 밑에를 보면 count % 2를 통해서 그 변수가 짝수인지 홀수인지 확인을 해줍니다.
그 후에 toUpperCase 메서드를 통해서 answer에 이어 붙여주고 count의 수를 1씩 올려줍니다.
그리고 홀 수일 경우에도 로직은 똑같지만 toLowerCase를 통해서 소문자로 바꿔줍니다.
또한, 이미 넘어오는 매개변수의 String이 소문자인데 굳이 toLowerCase를 해줘야 하는 것 같지 않아서 안 해줬었는데 그렇게 하니까 프로그래머스에서 틀렸다고 통과가 안되더군요 ㅠㅠㅠ 왜 그런지는 잘 모르겠네요
다른 분들의 로직을 보니까 삼항 연산자를 써서 굉장히 코드가 짧은 분들도 있더라고요
그런데 if문 혹은 삼항 연산자 중에서는 뭐가 좋고 나쁘고 가 없기 때문에 본인 취향이라고 생각합니다.
저도 가끔은 필요에 의해서 삼항 연산자를 사용하지만 if문을 통해서도 문제를 해결할 수 있다면 저는 if문을 선호하는 편입니다. 왜냐하면 더 가독성이 좋게 느껴지더군요
그럼 포스팅을 마무리하겠습니다 즐거운 명절 보내세요~~
'Algorithm' 카테고리의 다른 글
[JAVA] lv2 괄호 변환 (0) 2022.02.04 [JAVA] 주차 요금 계산 (0) 2022.02.03 [JAVA] 프로그래머스 x만큼 간격이 있는 숫자 (0) 2022.01.31 [JAVA] 프로그래머스 제일 작은 수 제거 (0) 2022.01.30 [JAVA] 프로그래머스 lv1 내적 (0) 2022.01.29