packageFORTRESS;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.util.ArrayList;importjava.util.StringTokenizer;classcircleInfo{intx,y,r;}classTreeNode{TreeNodeparent=null;circleInfodata=newcircleInfo();ArrayList<TreeNode>child=newArrayList<TreeNode>();}publicclassMain{staticintlongest=0;publicstaticvoidmain(String[]args)throwsIOException{// TODO Auto-generated method stubBufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));intTestCase=Integer.parseInt(br.readLine());for(inttc=0;tc<TestCase;tc++){intN=Integer.parseInt(br.readLine());TreeNode[]nodeArr=newTreeNode[N];for(inti=0;i<N;i++){nodeArr[i]=newTreeNode();StringTokenizerst=newStringTokenizer(br.readLine());nodeArr[i].data.x=Integer.parseInt(st.nextToken());nodeArr[i].data.y=Integer.parseInt(st.nextToken());nodeArr[i].data.r=Integer.parseInt(st.nextToken());}TreeNoderoot=nodeArr[0];//성벽에 포함관계에 알맞게끔 노드를 트리에 삽입for(inti=1;i<nodeArr.length;i++)addNode(root,nodeArr[i]);longest=longestLeaf2LeafDistance(root);LongestDistance(root);intresult=Math.max(longest,treeHeight(root));System.out.println(result);longest=0;}}//root트리의 서브트리에서 leaf-루트-leaf의 최대 경로 반환staticvoidLongestDistance(TreeNoderoot){if(root.child.size()==0)return;for(inti=0;i<root.child.size();i++){longest=Math.max(longest,longestLeaf2LeafDistance(root.child.get(i)));LongestDistance(root.child.get(i));}}//n을 root로 했을때 leaf-root-leaf간 최대거리staticintlongestLeaf2LeafDistance(TreeNoden){intmax1=0,max2=0;if(n.child.size()<2)return0;for(inti=0;i<n.child.size();i++){inttreeH=treeHeight(n.child.get(i));if(max1<treeH){max2=max1;max1=treeH;}elseif(max1>=treeH&&max2<treeH){max2=treeH;}}returnmax1+max2+2;}//트리의 높이반환 O(n)staticinttreeHeight(TreeNoden){if(n.child.size()==0)return0;intmaxH=0;for(inti=0;i<n.child.size();i++){intchildH=treeHeight(n.child.get(i));if(maxH<childH)maxH=childH;}returnmaxH+1;}//포함관계에 알맞게끔 트리에 노드를 추가staticvoidaddNode(TreeNoderoot,TreeNodeelem){intflagIsChild=isChild(root,elem);if(flagIsChild==1){//root가 elem을 포함하는 경우, root의 자식과의 포함관계를 탐색for(inti=0;i<root.child.size();i++){intfc=isChild(root.child.get(i),elem);if(fc==1){//만약 root.child[i]가 elem을 포함한다면 child를 root로 해서 재귀호출addNode(root.child.get(i),elem);return;}elseif(fc==-1){//만약 elem이 root.child[i]를 포함한다면, 그 사이에 삽입root.child.get(i).parent=elem;elem.parent=root;return;}}root.child.add(elem);}elseif(flagIsChild==-1){//elem이 root를 포함, root와 root의 부모사이에 elem을 삽입elem.parent=root.parent;root.parent=elem;}else{// 포함관계가 아닌 경우, 형제로 만들어 줌root.parent.child.add(elem);}}//두 노드간 포함관계를 반환staticintisChild(TreeNoderoot,TreeNodeelem){doublerootRadius=root.data.r;doubleelemRadius=elem.data.r;doubled=Math.sqrt(Math.pow(root.data.x-elem.data.x,2)+Math.pow(root.data.y-elem.data.y,2));if(rootRadius>elemRadius&&d<rootRadius-elemRadius)//root가 elem을 포함하는 경우, 1반환return1;elseif(rootRadius<elemRadius&&d<elemRadius-rootRadius)//elem이 root를 포함, -1반환return-1;return0;//둘 관계가 서로 포함관계가 아니면 0반환}}}
6년 전
0개의 댓글이 있습니다.
정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면
온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야
합니다. 현재 문제를 푸셨습니다.
mook1993@naver.com
책에 있는 아이디어 참고해서 제 나름 대로 한다고 했는데 제출하면 자꾸 오답처리 되네요...
제 소스코드에서 어떤게 문제점이 될 수 있는지 찾아주시면 감사하겠습니다~!!!
문제 URL
FORTRESS: 요새
고려한 사항들
6년 전