자바 알고리즘 문제

겹치는 선분의 길이 (10번 테스트만 실패) 도와주실분?

쿠키키키키 2024. 4. 12. 16:24

선분 3개가 평행하게 놓여 있습니다. 세 선분의 시작과 끝 좌표가 [[start, end], [start, end], [start, end]] 형태로 들어있는 2차원 배열 lines가 매개변수로 주어질 때, 두 개 이상의 선분이 겹치는 부분의 길이를 return 하도록 solution 함수를 완성해보세요. lines가 [[0, 2], [-3, -1], [-2, 1]]일 때 그림으로 나타내면 다음과 같습니다.

 

import java.util.*;

class Solution {
    public int solution(int[][] lines) {
        int answer = 0;
        Set<Integer> set = new TreeSet<>();

        //겹치는 부분이 있으려면 조건
        // 다시 풀어서 배열을 만들어볼까?
        // [2,5] 는 [2,3,4,5] 이런식으로
        List<List<Integer>> list = new ArrayList<>();
        List<Integer> middelList1=new ArrayList<>(); //(0번과1번) 1차적으로 2개에 선분이 겹치는 부분 다
        List<Integer> middelList2=new ArrayList<>();// (1번과2번)
        List<Integer> middelList3=new ArrayList<>(); //(2번과 0번)
        for (int i = 0; i < lines.length; i++) {
            int num=0; //새로운 안에 리스트 1씩 커지게할 변수
            List<Integer> li = new ArrayList<>();
            for (int j = 0; j <=lines[i][1]- lines[i][0]; j++) {

                li.add(lines[i][0]+num);
                num++;


            }
            list.add(li);
        }
        System.out.println("중간리스트1");
        for (int i = 0; i < list.get(0).size() ; i++) {
            for (int j = 0; j < list.get(1).size(); j++) {
                if(list.get(0).get(i)==list.get(1).get(j)){
                    middelList1.add(list.get(0).get(i));
                    System.out.print(list.get(0).get(i)+" " );
                }
            }
        }
        System.out.println("중간리스트2");
        for (int i = 0; i < list.get(1).size() ; i++) {
            for (int j = 0; j < list.get(2).size(); j++) {
                if(list.get(1).get(i)==list.get(2).get(j)){
                    middelList2.add(list.get(1).get(i));
                    System.out.print(list.get(1).get(i)+" ");

                }
            }
        }
        System.out.println("중간리스트3");
        for (int i = 0; i < list.get(2).size() ; i++) {
            for (int j = 0; j < list.get(0).size(); j++) {
                if(list.get(2).get(i)==list.get(0).get(j)){
                    middelList3.add(list.get(2).get(i));
                    System.out.print(list.get(2).get(i)+" ");

                }
            }
        }


        set.addAll(  middelList1);
        set.addAll(  middelList2);
        set.addAll(  middelList3);

        Integer[] array = set.toArray(new Integer[set.size()]);



        System.out.println("답은 "+set.size());

        System.out.println(Arrays.toString(array)); // [1, 2, 3]

        //[1,2,3] 은  1~3 길이가 2이다
        // [1,2,3 ,6,7] 이건 1~3 겹친것과 6~7 겹친게 들어있으니
        // 길이가 3이다.  겹친 선분 갯수마다 1이 빠져야 되므로
        //아래 for 문에서 그조건에 맞을때마다 1을 빼주고
        // 마지막 선분도 1이 빼줘야 해서 끝나고도 1을 또 뺴준다.
        for (int i = 0; i < array.length; i++) {
            answer++;
            if(i>0 && array[i]-array[i-1]!=1){
                answer--;
            }
        }

        answer--;



        //이건 위에 고민처럼 중간 선분이 합쳐져서 이어지는것처럼 보이는것들을
        //방지하기 위해서 빼주는거 
        if(middelList1.size()>0 &&middelList2.size()>0){
            if(middelList1.get(middelList1.size()-1)+1==middelList2.get(0)){
                answer--;
            }
            if(middelList2.get(middelList2.size()-1)+1==middelList1.get(0)){
                answer--;
            }
        }
        if(middelList2.size()>0 &middelList3.size()>0){
            if(middelList2.get(middelList2.size()-1)+1==middelList3.get(0)){
                answer--;
            }
            if(middelList3.get(middelList3.size()-1)+1==middelList2.get(0)){
                answer--;
            }
        }
        if(middelList3.size()>0 && middelList1.size()>0){
            if(middelList3.get(middelList3.size()-1)+1==middelList1.get(0)){
                answer--;
            }
            if(middelList1.get(middelList1.size()-1)+1==middelList3.get(0)){
                answer--;
            }
        }



        System.out.println("답은"+answer);
        return answer;


    }
}

 

 

와 결국 못풀음 ㅋㅋㅋㅋ 테스트 10번만 틀리고  반례는 못찾아서 일단 블로그에 글을 올립니다

 

푸는 방식은 일단 일차로 겹치는 선분 리스트를 구하고 

그 리스트 끼리를 다시 Set 에 넣어서 자동으로 중복은 지워 가지고 

그 set 의 길이로 판별해서 답을 구하는 방식인데 

이 10번이 안되네...  아이고...

'자바 알고리즘 문제' 카테고리의 다른 글

정수를 나선형으로 배치하기  (0) 2024.04.16
평행  (0) 2024.04.13
주사위 게임 3  (0) 2024.04.11
안전지대  (0) 2024.04.09
분수의 덧셈  (0) 2024.04.08