4. 단어 뒤집기(StringBuilder 이용법 또는 직접 뒤집기)
설명 : N개의 단어가 주어지면 각 단어를 뒤집어 출력하는 프로그램을 작성
입력:
(첫 줄에 자연수 N(3<=N<=20)이 주어짐)
(두 번째 줄부터 N개의 단어가 각 줄에 하나씩 주어짐. 단어는 영어 알파벳으롷만 구성되어 있음)
출력:
N개의 단어를 입력된 순서대로 한 줄에 하나씩 뒤집어서 출력함.
1) 소스코드
class Main {
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;
}
public static void main (String[] args)
{
Main T = new Main();
Scanner kb = new Scanner(System.in);
int n = kb.nextInt();
String[] str = new String[n];
for (int i = 0; i < n; i++) {
str[i] = kb.next();
}
for (String x : T.solution(n, str)) {
System.out.println(x);
}
}
}
-----------------------------------------------------------
2) 코드 분해
우선 메인에서 int를 입력받는다고 했으니, 입출력 함수인 nextInt()를 이용해 입력한 정수를 n에 저장.
그리고 String 동적 배열을 생성.
반복문을 통해 배열에 데이터를 저장
그리고 T.solution을 통해 n과 str을 넘김
강의 설명은 이해가 잘 안되는데, 내가 잘 모르는 문법들이 나오니 답답하다.
우선 StringBuilder에 대해 알아보자.
자바에선 문자열을 떠올리면 자연스레 String이 생각난다.
만약 이 문자열이 1개가 아닌 2개 이상이고 이 것을 더해야 한다면 어떻게 해야할까?
그냥 우리가 생각하기엔 str1+str2를 생각할 수 있는데, String 객체간 더하는 행동은 메모리 할당과 메모리 해제를 야기해 더하는 연산이 많아진다면 성능적인 이슈가 생길 수 있다.
https://www.codejava.net/java-core/the-java-language/why-use-stringbuffer-and-stringbuilder-in-java(참고)
결국 생각해보면 많은 문자열을 연결하면 새로운 중간 객체를 계속해서 만드는데 데이터가 많아질수록 비효율적으로 변할 것이다. 자바에서는 String 객체의 변경이 불가해 2개의 문자열을 서로 연결한다면 새 문자열이 만들어 지고 이전의 문자열을 가비지 컬렉터로 들어간다. 결국 데이터의 양이 방대해질수록 낭비가 심해질텐데 이러한 이슈를 막고자 나오는 것이 String Builder이다.
StringBuilder은 문자열을 더할 때마다 새로운 객체를 생성하는 것이 아닌, 기존의 데이터에 더하는 방식을 사용해 속도도 빠르고 상대적으로 부하가 적어 효과적이다.
문자열을 연결할 땐 append()의 인자로 연결하고자 하는 문자열을 넣어 String Builder의 객체를 통ㅎ해 호출하고, 출력시에는 toSring()을 통해 출력한다.
'알고리즘 및 자료구조' 카테고리의 다른 글
문자열(String)을 이용한 문제 풀이 (3문제) (0) | 2022.12.01 |
---|---|
chapter. String (숫자만 추출) (0) | 2022.11.30 |