//내 코드
package problem;
import java.util.Scanner;
public class Main {
public String[] solution(String[] str, int num) {
String[] answer=new String[num];
char[] ch;
for (int j = 0; j < str.length; j++) {
ch = str[j].toCharArray();
answer[j]="";
for (int i = ch.length-1; i >= 0; i--) {
answer[j] += ch[i];
}
}
return answer;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Main T = new Main();
int num = sc.nextInt();
sc.nextLine();
String[] str = new String[num];
for (int i = 0; i < num; i++) {
str[i] = sc.nextLine();
}
for(String x :T.solution(str, num)) {
System.out.println(x);
}
sc.close();
}
}
나는 그냥 비효율의 극으로 풀었다.
1.먼저 입력되는 숫자를 입력받고
2. 숫자만큼 문자열을 배열로 입력받고
3. 함수로 보내서 뒤집은 후 answer함수에 담아서 다시 return했다.
3-1 answer는 "입력받은 숫자"만큼 배열을 생성했다.
3-2 for문은 "숫자만큼 받은 배열"의 길이만큼 반복하는것으로 했다. 왜냐하면 그래야 3문자 받고 3문자 뒤집을 수 있으니까. 사실 num이 입력받는 숫자이기때문에 num으로 쓰는게 더 가독성이 좋았을 것 같다.
3-3 이후 num=3에 go, to, hell을 입력받았다고 하면 go를 문자 배열로 만들어서 ch에 담았다
3-4 답으로 보낼 배열인 answer은 초기화안하고 담으려고 하니까 null + "내가입력한문자열"이 되버려서 ""로 초기화 시켜줬다.
3-5 문자열을 문자배열로 담은 배열 ch를 역순으로 answer에 넣어 줬다. 예를 들어 hello이면 answer= "" +o+l+l+e+h같이 담는거다.
3-6 이후 answer[1], answer[2]도 순차적으로 담고
3-7 main함수에서 향상된 for문으로 T.solution(str,num) -> 즉 answer을 순차적으로 출력했다.
//인프런 코드
package problem;
import java.util.ArrayList;
import java.util.Scanner;
public 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) {
Scanner sc = new Scanner(System.in);
Main T = new Main();
int n = sc.nextInt();
sc.nextLine();
String[] str = new String[n];
for (int i = 0; i < n; i++) {
str[i] = sc.nextLine();
}
for(String x : T.solution(n,str)) {
System.out.println(x);
}
}
}
하지만 인프런 코드는 매우 효율적이었다. StringBuilder라는 클래스를 사용하여 문제를 간단하게 해결했다.
1. 입력받을 n개 받고
2. 입력받은 문자들을 str문자열에 담고
3. 향상된 for문으로 T.solution -> 즉 answer을 출력한다.
3-1 answer은 ArrayList임으로 배열이 늘어나도 대처가능하고
참고) Java 리스트(List) 컬렉션 종류 ArrayList, Vector, LinkedList가 있다.
3-2 입력받은 문자들을 담은 str을 향상된 for문으로 돌린다.
3-3 StringBuilder에 str의 원소인 x를 담고 .reverse()로 뒤집고 .toString으로 문자열로 바꾼다.(안에 여러가지 메소드가 있는것 같다. 어쨋거나 저쨋거나 String으로 보내주려면 .toString을 해줘야한다.)
3-4 tmp에 뒤집어진 문자열을 넣고 arraylist인 answer에 넣어준다.
3-5 이후 향상된 for문으로 출력
//인프런코드2
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public ArrayList<String> solution(int n, String[] str) {
ArrayList<String> answer = new ArrayList<>();
for (String x : str) {
char[] s = x.toCharArray();
int lt = 0, rt = x.length() - 1;
while (lt < rt) {
char tmp = s[lt];
s[lt] = s[rt];
s[rt] = tmp;
lt++;
rt--;
}
String tmp = String.valueOf(s);
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);
}
}
}
두번째 인프런 코드는 메소드를 써서 구현한게 아니라 일일히 바꾼것인데 조금 신기하다고 생각했다.
에를 들어
1 2 3 4 5 6
1을 lt라 지칭하고
6을 rt라 지칭한다.
1과 6을 바꾸고, 2와 5를 바꾸고 3과 4를 바꾼다. 이때 lt < rt의 조건에 맞지않으면 더이상 교환하지 않는다는 것이였다.
자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비 - 인프런 | 강의
자바(Java)로 코딩테스트를 준비하시는 분을 위한 강좌입니다. 코딩테스트에서 가장 많이 출제되는 Top 10 Topic을 다루고 있습니다. 주제와 연동하여 기초문제부터 중급문제까지 단계적으로 구성
www.inflearn.com
'2022 > 코딩테스트' 카테고리의 다른 글
[인프런] 자바 알고리즘 문제풀이 멘토링_12 (0) | 2022.08.31 |
---|---|
인프런 코딩테스트 강의 메모 - 유효한 팰린드롬 (0) | 2022.07.20 |
인프런 코딩테스트 강의 메모 - 회문문자열 (0) | 2022.07.14 |
인프런 코딩테스트 강의 메모 - 대소문자변환 (0) | 2022.07.07 |