선분 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 |