어흥

[SWEA 3378] 스타일리쉬 들여쓰기 (JAVA) 본문

알고리즘/SWEA

[SWEA 3378] 스타일리쉬 들여쓰기 (JAVA)

라이언납시오 2020. 3. 12. 16:38
728x90
반응형

문제 링크: https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWD3nB5q3T0DFAUZ

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

1. 주의할 점

- -1을 출력하는 경우가 언제인지 잘 살핀다(답이 여러개인 경우 '0 -1'을 출력하는 것으로 착각해서 테케 8번이 맞지 않았었다).

- R,C,S가 나타낼 수 있는 수는 20 X 20 X 20이다.

- 전역변수로 선언할 경우 초기화가 중요하다.

 

2. 구현 (추후에 코드를 좀 다듬을 필요가 있다)

- DFS를 통해 R,C,S가 나타낼 수 있는 모든 수에 대해 Start() 함수를 실행한다.

- R,C,S의 값을 통해 마스터의 글에 적용이 가능하다면 나의 글에도 적용한다 -> Ans[]에 출력할 값을 입력한다.

- 만약 Ans[index]가 다른 값을 가질 수 있다면 Ans[index]에는 -1을 넣는다. (Ans 전체가 -1인것이 아니다)

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Solution {
    static String str1[][];
    static int master_op[], my_op[], rcs[],ans[];
    static int master, me;
    static boolean avail;
    static void start(int idx, int cnt, int dot) { // 누구의 글인지 판별(0:마스터, 1: 나), 해당 줄, 필요한 점의 갯수
        if (idx==0 && cnt == master || idx==1 && cnt==me)
            return;
        int d = 0;
        boolean fin = false;
        for (int i = 0; i < str1[idx][cnt].length(); i++) {
            if (idx == 0) {
                if (str1[idx][cnt].charAt(i) == '.' && !fin)
                    d++;
                else if (str1[idx][cnt].charAt(i) != '.' && !fin) {
                    fin = true;
                    if (dot != d) { // 들여쓰기가 필요한 갯수만큼 되어 있지 않은 경우
                        avail = false;
                        break;
                    }
                }
            }
            if (str1[idx][cnt].charAt(i) == '(') {
                if (idx == 0)
                    master_op[0]++;
                else
                    my_op[0]++;
            } else if (str1[idx][cnt].charAt(i) == ')') {
                if (idx == 0)
                    master_op[1]++;
                else
                    my_op[1]++;
            } else if (str1[idx][cnt].charAt(i) == '{') {
                if (idx == 0)
                    master_op[2]++;
                else
                    my_op[2]++;
            } else if (str1[idx][cnt].charAt(i) == '}') {
                if (idx == 0)
                    master_op[3]++;
                else
                    my_op[3]++;
            } else if (str1[idx][cnt].charAt(i) == '[') {
                if (idx == 0)
                    master_op[4]++;
                else
                    my_op[4]++;
            } else if (str1[idx][cnt].charAt(i) == ']') {
                if (idx == 0)
                    master_op[5]++;
                else
                    my_op[5]++;
            }
        }
        if (idx == 1) {
            if(ans[cnt]==-2)        ans[cnt]=dot;   //처음 들어가는 경우            
            else if(ans[cnt]!=dot)  ans[cnt]=-1;
        }
         
        if (avail) {
            if (idx == 0)
                start(idx, cnt + 1, rcs[0] * (master_op[0] - master_op[1]) + rcs[1] * (master_op[2] - master_op[3])
                        + rcs[2] * (master_op[4] - master_op[5]));
            else
                start(idx, cnt + 1, rcs[0] * (my_op[0] - my_op[1]) + rcs[1] * (my_op[2] - my_op[3])
                        + rcs[2] * (my_op[4] - my_op[5]));
        }
    }
 
    static void dfs(int cnt) {
        if (cnt == 3) {
            avail = true;
            for (int i = 0; i < 6; i++)
                master_op[i] = 0;
            start(0, 0, 0);
            if (avail) 
                start(1, 0, 0);         
            return;
        }
        for (int i = 1; i < 21; i++) {
            rcs[cnt] = i;
            dfs(cnt + 1);
        }
    }
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int test = Integer.parseInt(br.readLine().trim());
        for (int t = 1; t <= test; t++) {
            String s1 = br.readLine();
            StringTokenizer st = new StringTokenizer(s1);
            master = Integer.parseInt(st.nextToken());
            me = Integer.parseInt(st.nextToken());
            // 초기화
            rcs = new int[3];
            master_op = new int[6];
            my_op = new int[6];
            ans = new int[me];
            for(int i=0;i<me;i++)
                ans[i]=-2;
            str1 = new String[2][80];
             
            for (int i = 0; i < master; i++) {
                String ss = br.readLine().trim();
                str1[0][i] = ss;
            }
            for (int i = 0; i < me; i++) {
                String ss = br.readLine().trim();
                str1[1][i] = ss;
            }
            System.out.print("#" + t + " ");
            dfs(0);
            for(int i=0;i<me;i++)
                System.out.print(ans[i]+" ");
            System.out.println();
        }
    }
}
728x90
반응형
Comments