문제
설명
N개의 단어가 주어지면 각 단어를 뒤집어 출력하는 프로그램을 작성하세요.
입력
첫 줄에 자연수 N(3<=N<=20)이 주어집니다.
두 번째 줄부터 N개의 단어가 각 줄에 하나씩 주어집니다. 단어는 영어 알파벳으로만 구성되어 있습니다.
출력
N개의 단어를 입력된 순서대로 한 줄에 하나씩 뒤집어서 출력합니다.
예시 입력 1
3
good
Time
Big
예시 출력 1
doog
emiT
giB
직접 풀어보기
원하는 단어 수 만큼 받아오기
단어 3개를 받아온다고 가정했을 때, int num을 선언하여 이를 원하는 단어 수 변수로 설정한 후, String[] 배열을 선언하여 for문을 통해 사용자로부터 String을 받아 배열에 저장하게 한 후 이를 num 만큼 반복하였습니다.
단어 뒤집기
일일이 뒤집는 방법을 선택하였습니다. char[] 배열로 단어를 toCharArray()를 통해 저장하였고, answer char[] 배열을 선언하여 사이즈가 똑같게 만들어서 답을 옮길 공간을 만들었습니다. 그 후 for문을 사용하여 그림과 같은 방식으로 옮겨주었습니다.
배열 선언부와 사용할 때 []안에있는 숫자의 의미가 다름을 인지하고 있어야 합니다. 인덱스 접근 문제로 OutOfBounds 에러가 발생할 수 있습니다.
한계
반복할 때마다 word와 answer 배열을 계속 초기화 시켜줘야되는 단점이 있습니다. 이 경우 메모리 낭비와 시간 초과로 이어질 수 있습니다. 이를 최소화 할 수 있는 방법이 필요합니다.
import java.util.*;
class Main {
public void solution(String[] words, int n) {
for(int i = 0; i < n; i++) {
char[] word = words[i].toCharArray();
char[] answer = new char[words[i].length()];
for(int j = 0; j < words[i].length(); j++) {
answer[j] = word[words[i].length()-j-1];
}
answer.toString();
System.out.println(answer);
}
}
public static void main(String[] args) {
Main m = new Main();
Scanner in = new Scanner(System.in);
int num = in.nextInt();
String[] stringArr = new String[num];
for(int i = 0; i < num; i++){
stringArr[i] = in.next();
}
m.solution(stringArr, num);
}
}
풀이
*. 정답 print할 때
문자열을 받고 solution에 넘길 때, ArrayList<String>를 활용하였습니다.
편의상 for each 구문을 사용해서 더 간결하게 보이기 위함입니다. 또한, solution에서 항상 return값을 반환해서 main에서 print할 수 있는 구조를 만들기 위해 사용했습니다.
public ArrayList<String> solution(String[] words, int n) {
ArrayList<String> answer = new ArrayList<>();
...
return answer;
}
public static void main(String[] args) {
Main t = new Main();
...
for(String x : m.solution(stringArr, num)) {
print
}
}
1. StringBuilder의 reverse()
String을 여러개 다룰 때 쓰기 좋은 String 타입의 여러 기능들을 제공해주는 StringBuilder 클래스를 사용했습니다. 이에 StringBuilder의 reverse() 기능을 사용해 단어를 뒤집고 다시 toString()을 통해 String 객체로 바꾼 뒤 이를 반환하는 방법을 사용했습니다.
public ArrayList<String> solution(String[] words, int n) {
ArrayList<String> answer = new ArrayList<>();
for(String t : words) {
String temp = new StringBuilder(t).reverse().toString();
answer.add(temp);
}
return answer;
}
2. char[]로 한개씩 직접 뒤집기
직접 풀이 방법에서 한계점을 보완한 방법입니다. 기존에는 word와 answer 둘 다 메모리 공간에 할당되어 공간낭비가 이루어졌습니다. word에서 answer로 단어 하나씩 옮기는 방법이 아닌, word 내에서 뒤집는 방법을 선택하면 됩니다.
그림과 같이 toCharArray()를 이용해 char[] 배열로 받는 후에 처음 인덱스를 lt, 마지막 인덱스를 rt로 설정하여 이 두 인덱스에 있는 값을 temp 변수를 사용하여 switching하면 됩니다.
이 방법은 단순히 문자를 뒤집는 것에서 한단계 나아가 원하는 문자를 선택하여 뒤집을 수 있는 방법입니다. 이에 메서드를 사용하지 않고 순수 손코딩으로 풀어서 해결합니다.
public ArrayList<String> solution(String[] words) {
ArrayList<String> answer = new ArrayList<>();
for(String t : words) {
char[] word = t.toCharArray();
int lt = 0;
int rt = t.length()-1;
char temp;
while(lt < rt) {
temp = word[lt];
word[lt] = word[rt];
word[rt] = temp;
lt++;
rt--;
}
String answerWord = String.valueOf(word);
answer.add(answerWord);
}
return answer;
}
'CS > Data Structure & Algorithm' 카테고리의 다른 글
[String] 6. 중복문자제거 (0) | 2022.09.22 |
---|---|
[String] 5. 특정 문자 뒤집기 (1) | 2022.09.16 |
[String] 3. 문장 속 단어 (0) | 2022.08.13 |
Algorithm & Data Structure (0) | 2022.08.13 |
자료구조와 알고리즘을 공부하는 이유 (0) | 2022.08.13 |