띠오니 개발자 성장일지
article thumbnail
반응형

인프런의 "자바(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를 사용하면 이 객체 하나를 통해 문자열을 활용할 수 있기 때문에,
계속 문자열 객체를 만들 필요가 없어 연산 부담이 적다.

공식문서는 여기로! 👈

Java 11 공식문서

 

 

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);	// 앞 뒤가 뒤바뀐 문자열을 저장한다.
}

while() 문 진입 전 초기화 단계
첫 번째 while문 돌았을 때 상태
세번 째 while문으로 [1], [3] 번째 자리 바꾼 후 마지막 while문 종료

이 방식으로 단어의 글자 개수가 홀수자리든 짝수자리든 간 상관없이 앞뒤를 바꿀 수 있다.

 

 

🤓 정리

  • StringBuilder 는 문자열을 효율적이게 변경, 가공할 수 있다. 중요하다!
  • char[] 을 문자열로 바꿀 땐 String.valueOf() 로 변환할 수 있다.

 

 

 


사실 난 main 함수 쓰는 거나, solution() 을 정의하는 게 좀 헷갈린다. 내가 어디까지 적어야 하는..? ㅋㅋ 프로그래머스에는 solution() 메소드를 정의해주는데 실제로 내가 쓰려고 하니 이것도 코드에 반영해서 풀어야 하나..? 싶은 부분이 종종 있다.

문제 중 입력 이라고 된 부분까지 잘 읽어보고 내가 적는 게 맞는거겠지...?

이건 문제를 좀 많이 풀어보며 감을 잡는 게 맞는 것 같다!

오랜만에 올리지만 화이팅 ~

 

 

반응형
profile

띠오니 개발자 성장일지

@띠오니

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!