Algorithm/SW Expert Academy

[SWEA] 10804 문자열의 거울상

SSONGMI 2021. 2. 11. 13:44
반응형

: 처음에 문제를 봤을 때 문자열을 기준으로 어디에 거울을 놓은건지 알 수 없어서 조금 헤맸다.

: 내 기준으로 해석하면 문자열의 가장 왼쪽에 거울을 놓은 것으로 생각하면 된다.

: 왼쪽에 거울을 놓으면 거울과 가장 근접한 글자가 끝 부분이 되고, 거울과 가장 먼 부분이 비친 문자열을 처음부분이 된다.

: 문자의 원래 타입(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);
    }
     
}

 

반응형