단체사진 찍기

LJM·2023년 3월 24일
0

programmers

목록 보기
2/92
post-thumbnail

https://school.programmers.co.kr/learn/courses/30/lessons/1835

brute force 로 풀었다
오랜만에 사용하려니 엄청 버벅이면서 짯다. 그래도 기억해내서 풀었다.

무작위로 만들어낸 배열이 조건에 부합하는지 체크하는 부분코드가 길다;;

class Condition
{
    Character start;
    Character end;
    int gap;
    Character operator;
}

class Solution {
    public int solution(int n, String[] data) {
        int answer = 0;
        
        Character[] element = {'A', 'C', 'F', 'J', 'M', 'N', 'R', 'T'};
        int len = element.length;

        Character[] cand = new Character[len];
        boolean[] visit = new boolean[len];

        Condition[] con = new Condition[n];

        for (int i = 0; i < n; i++)
        {
            con[i] = new Condition();
            con[i].start = data[i].charAt(0);
            con[i].end = data[i].charAt(2);
            con[i].operator = data[i].charAt(3);
            con[i].gap = Integer.parseInt(String.valueOf(data[i].charAt(4)));
        }

        answer = dfs(len, 0, element, cand, visit, n, con);

        return answer;
    }
    
    static public int dfs(int len, int level, Character[] element, Character[] cand, boolean[] visit, int n, Condition[] con)
    {
        if(level == len)
        {
            int startidx = 0;
            int endidx = 0;
            boolean satisfy = true;
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < len; j++)
                {
                    if(cand[j] == con[i].start)
                        startidx = j;
                    else if(cand[j] == con[i].end)
                        endidx = j;
                }

                if(con[i].operator =='=')
                {
                    if(Math.abs(startidx-endidx) == (con[i].gap +1))
                    {

                    }
                    else
                    {
                        satisfy = false;
                        break;
                    }
                }
                else if(con[i].operator =='<')
                {
                    if(Math.abs(startidx-endidx) < (con[i].gap +1))
                    {

                    }
                    else
                    {
                        satisfy = false;
                        break;
                    }
                }
                else// '>'
                {
                    if(Math.abs(startidx-endidx) > (con[i].gap +1))
                    {

                    }
                    else
                    {
                        satisfy = false;
                        break;
                    }
                }
            }

            if(satisfy)
            {
                return 1;
            }

            return 0;
        }

        int ret = 0;

        for (int i = 0; i < len; i++)
        {
            cand[level] = element[i];

            if(visit[i] == false)
            {
                visit[i] = true;
                ret += dfs(len, level+1, element, cand, visit, n, con);
                visit[i] = false;
            }
        }

        return ret;
    }
}
profile
게임개발자 백엔드개발자

0개의 댓글