[SWEA] 10804 문자열의 거울상
: 처음에 문제를 봤을 때 문자열을 기준으로 어디에 거울을 놓은건지 알 수 없어서 조금 헤맸다.
: 내 기준으로 해석하면 문자열의 가장 왼쪽에 거울을 놓은 것으로 생각하면 된다.
: 왼쪽에 거울을 놓으면 거울과 가장 근접한 글자가 끝 부분이 되고, 거울과 가장 먼 부분이 비친 문자열을 처음부분이 된다.
: 문자의 원래 타입(type)과 거울에 비쳤을 때 보이는 타입(mirrorType)으로 먼저 인덱스를 맞춰 배열로 선언했다.
: 처음에는 문자열의 마지막 부분부터 접근해야된다는 생각을 해서 stack을 사용해봤다.
: 조금 더 생각해보니 굳이 stack을 사용하기 보다는 그냥 인덱스를 통해 문자열 뒤편부터 접근할 수 있다는 생각을 했다.
: 여기서 주의할 점은 거울에 비친 타입으로 바꿔준 후 해당 문자의 type이 무엇인지 판단하는 for문을 끝내주어야 한다.
그렇지 않으면 이미 mirrorType으로 바뀐 문자가 또 다시 다른 문자로 바뀔 수 있다.
-v1. stack 사용-
1. 테스트 케이스 수(T)를 입력받는다.
2. 문자열을 입력받는다.
3. 문자열을 스택에 넣어줌으로써 마지막 문자에 제일 먼저 접근할 수 있도록 했다.
4. 스택에 접근하며 그 요소를 mirrorType의 요소로 바꿔주고 새로운 문자열(newStr)에 넣어주었다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;
public class Solution {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws NumberFormatException, IOException {
int T = Integer.parseInt(br.readLine());
// 원래 글자
char[] type = {'b','d','p','q'};
// 거울에 비쳤을 때
char[] mirrorType = {'d','b','q','p'};
for(int tc = 1; tc <= T; tc++) {
// 문자열 입력
String s = br.readLine();
Stack<Character> str = new Stack<>();
StringBuilder newStr = new StringBuilder();
// 거울에 비치면 그 순서가 역순이 되기때문에 stack에 넣어줌
for(int i = 0; i < s.length(); i++) {
str.push(s.charAt(i));
}
// stack에서 한 문자씩 빼면서 원래 타입에서 거울에 비친 타입으로 바꿔줌
for(int i = 0; i <s.length(); i++) {
for(int j = 0; j < type.length; j++) {
if(str.peek() == type[j]) {
newStr.append(mirrorType[j]);
str.pop();
break;
}
}
}
sb.append("#" + tc + " " + newStr + "\n");
}
System.out.println(sb);
}
}
-v2. 인덱스를 통해 문자열을 뒤쪽부터 접근-
1. 테스트 케이스 수(T)를 입력받는다.
2. 문자열을 입력받는다.
3. 문자열을 인덱스를 통해 마지막 문자에 제일 먼저 접근할 수 있도록 했다.
4. 접근한 요소를 mirrorType의 요소로 바꿔주고 새로운 문자열(newStr)에 넣어주었다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;
public class Solution {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws NumberFormatException, IOException {
int T = Integer.parseInt(br.readLine());
// 원래 글자
char[] type = {'b','d','p','q'};
// 거울에 비쳤을 때
char[] mirrorType = {'d','b','q','p'};
for(int tc = 1; tc <= T; tc++) {
// 문자열 입력
String s = br.readLine();
StringBuilder newStr = new StringBuilder();
// 거울에 비치면 그 순서가 역순으로 바뀌므로 문자열을 뒤에서 부터 접근
for(int i = s.length()-1; i >= 0; i--) {
for(int j = 0; j < type.length; j++) {
if(s.charAt(i) == type[j]) {
newStr.append(mirrorType[j]);
break;
}
}
}
sb.append("#" + tc + " " + newStr + "\n");
}
System.out.println(sb);
}
}