인프런의 "자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비" 강좌를 수강했습니다.
Q1-04. 단어 뒤집기
n개의 단어가 주어지면, 각 단어를 뒤집어 출력한다.
첫 줄엔 숫자(3<=n<=20)를 입력받고, 그 다음 줄 부턴 n개에 해당하는 단어들을 입력받는다.
각 줄의 단어들을 뒤집어 출력하기.
✏️ 내가 쓴 답
숫자 n을 입력받고, n개의 String을 입력해주므로 main()의 첫 번째 반복문으로 n번 째 까지 반복문으로 단어를 입력해준다.
solution() 에서 파라미터를 String배열 str로 받고, 답으로 반환될 ArrayList() answer를 생성해준다. 반복문을 통해 각각 줄의 단어를 toCharArray()로 문자 배열로 변환한다.
뒤집은 문자를 하나씩 저장하기 위한 String word 를 선언한다. 예를 들어 단어가 apple이었다면, 14line의 반복문을 통해 i는 apple의 길이만큼, 즉 5번째부터 0이 되기 전까지 i를 감소시켜준다.
그러고 word 에는 단어의 뒤에서부터 누적해서 저장한다. 즉 e l p p a 순으로 저장하는 것! 주의할 점은 `i-1`이라는 점!!
답이 들어갈 ArrayList 배열에는 answer.add()로 뒤집힌 단어가 저장되어있는 word 단어를 저장한다.
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public ArrayList<String> solution(String[] str) {
ArrayList<String> answer = new ArrayList<>();
for(String x : str){
String word = "";
char[] cArr = x.toCharArray();
for(int i=cArr.length; i>0; i--){ // 뒤에서부터 앞으로 진행
word += cArr[i-1];
}
answer.add(word);
}
return answer;
}
public static void main(String[] args){
Main main = new Main();
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] arr = new String[n];
for(int i=0; i<n; i++){
arr[i] = sc.next();
}
for(String x : main.solution(arr)){
System.out.println(x);
}
}
}
👨🏻🏫 수정한 코드
강의를 참고하여 아래와 같이 수정했다.
☝🏻 첫 번째 방법
StringBuilder
를 사용하는 방법!
StringBuilder란?
문자열을 다루는 객체
왜 써?
문자열들끼리 더하거나 replace 등을 통해 String을 수정하면,
String 자체에 수정을 할 수 없고 계속해서 새로운 문자열 객체를 만들게 된다.
StringBuilder를 사용하면 이 객체 하나를 통해 문자열을 활용할 수 있기 때문에,
계속 문자열 객체를 만들 필요가 없어 연산 부담이 적다.
공식문서는 여기로! 👈
1. String 문자열을 new StringBuilder(x) 를 통해 StringBuilder객체로 변환한다.
2. 이를 reverse() 메소드를 통해 앞 뒤를 바꾸어준다.
3. 앞뒤가 뒤바뀐 단어는 StringBuilder 객체이기 때문에 toString() 메소드를 통해 문자열로 변환하면 간편하게 앞뒤 바꾸기 끝!
확실히 이렇게 하니 코드도 훨씬 간략하고 편리한 것 같다.
StringBuilder와 StringBuffer 비교(출처. wakestand님) 하는 자료도 많은 듯 하니 시간이 날 때 확인해봐야겠다.
public ArrayList<String> solution(int n, String[] str) {
ArrayList<String> answer = new ArrayList<>();
for(String x : str) {
String tmp = new StringBuilder(x).reverse().toString();
answer.add(tmp);
}
return answer;
}
✌🏻 두 번째 방법
Swap 방식
을 이용한 양 끝단의 문자를 서로 바꾸는 방법!
옛날에 대학교 들어가서 C언어 처음 배울 때 했던건데 그 방식을 쓴다! 😺
public ArrayList<String> solution(int n, String[] str) {
ArrayList<String> answer = new ArrayList<>();
for(String x : str) {
char[] cArr = x.toCharArray();
int lt = 0, rt = cArr.length;
while(lt < rt){
char tmp = cArr[rt]; // 맨 뒷 글자 임시저장
cArr[rt] = cArr[lt]; // 맨 뒷 자리에 맨 앞글자 저장
cArr[lt] = tmp; // 맨 앞 자리엔 임시저장 했던 맨 뒷글자 저장
lt++;
rt--;
}
String tmp = String.valueOf(cArr); // char[] 단어를 String으로 변환
answer.add(tmp); // 앞 뒤가 뒤바뀐 문자열을 저장한다.
}
이 방식으로 단어의 글자 개수가 홀수자리든 짝수자리든 간 상관없이 앞뒤를 바꿀 수 있다.
🤓 정리
StringBuilder
는 문자열을 효율적이게 변경, 가공할 수 있다. 중요하다!- char[] 을 문자열로 바꿀 땐
String.valueOf()
로 변환할 수 있다.
사실 난 main 함수 쓰는 거나, solution() 을 정의하는 게 좀 헷갈린다. 내가 어디까지 적어야 하는..? ㅋㅋ 프로그래머스에는 solution() 메소드를 정의해주는데 실제로 내가 쓰려고 하니 이것도 코드에 반영해서 풀어야 하나..?
싶은 부분이 종종 있다.
문제 중 입력 이라고 된 부분까지 잘 읽어보고 내가 적는 게 맞는거겠지...?
이건 문제를 좀 많이 풀어보며 감을 잡는 게 맞는 것 같다!
오랜만에 올리지만 화이팅 ~
'Study > 알고리즘' 카테고리의 다른 글
[알고리즘/인프런] String(문자열) #1-06. 중복문자제거 (2) | 2022.04.14 |
---|---|
[알고리즘/인프런] String(문자열) #1-05. 특정문자 뒤집기 (0) | 2022.04.13 |
[알고리즘/인프런] String(문자열) #1-03. 문장 속 단어 (0) | 2022.04.07 |
[알고리즘/인프런] String(문자열) #1-02. 대소문자 변환 (0) | 2022.04.06 |
[알고리즘/인프런] String(문자열) #1-01. 문자 찾기 (0) | 2022.04.05 |