Develope/알고리즘

[백준-10825] 국영수

고로이 2017. 11. 29. 13:52
반응형

[백준-10825] 국영수

도현이네 반 학생 N명의 이름과 국어, 영어, 수학 점수가 주어진다. 이 때, 다음과 같은 조건으로 학생의 성적을 정렬하는 프로그램을 작성하시오.

  1. 국어 점수가 감소하는 순서로
  2. 국어 점수가 같으면 영어 점수가 증가하는 순서로
  3. 국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로
  4. 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로



시간 제한메모리 제한제출정답맞은 사람정답 비율
1 초256 MB35391423106741.325%



JAVA 1

시간초과; ㅎㅎ;;;;;; 결과는 맞는데..ㅎㅎㅎ;;;;...젠장

쉽게가려 햇다가 망한건가 ㅎ;

public class Main {


    public static void main(String[] args) throws Exception{

        java.util.List<NodeVO> nodeVOList = new java.util.ArrayList<NodeVO>();

        StringBuilder sb = new StringBuilder();

        java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));

        int count = Integer.parseInt(br.readLine());

        for (;count>0;count--) {

            NodeVO node = new NodeVO(br.readLine());

            insertList(nodeVOList,node);


        }

        for(NodeVO vo : nodeVOList){

            sb.append(vo.getName()+"\n");

        }

        System.out.println(sb.toString());

    }

    public static void insertList(java.util.List<NodeVO> nodeVOList, NodeVO node){

        if(nodeVOList.size()==0){

            nodeVOList.add(node);


        }else{

            for(int i=0;i<nodeVOList.size();i++) {

                if(compareList(nodeVOList.get(i),node)){

                    nodeVOList.add(i,node);

                    return;

                }

            }

            nodeVOList.add(node);

        }


    }



    public static boolean compareList(NodeVO nextNode, NodeVO currentNode){

        if(nextNode.getKorea() < currentNode.getKorea()){

            return true;

        }else if(nextNode.getKorea() == currentNode.getKorea()) {

            if(nextNode.getEnglish() > currentNode.getEnglish()){

                return true;

            }else if(nextNode.getEnglish() == currentNode.getEnglish()) {                

                if(nextNode.getMath() < currentNode.getMath()){

                    return true;

                }else if(nextNode.getMath() == currentNode.getMath()) {

                    if(nextNode.getName().compareTo(currentNode.getName())>0) return true;

                    else return false;

                }

            }

        }

        return false;

    }

    public static class NodeVO {

        // data

        private String name;

        private int korea;

        private int english;

        private int math;


        public NodeVO(String name, int korea, int english, int math) {

            this.name = name;

            this.korea = korea;

            this.english = english;

            this.math = math;

        }

        public NodeVO(String line) {

            String[] spl = line.split(" ");

            this.name = spl[0];

            this.korea = Integer.parseInt(spl[1]);

            this.english = Integer.parseInt(spl[2]);

            this.math = Integer.parseInt(spl[3]);

        }



        @Override

        public String toString() {

            return "Node{" +

                    "name='" + name + '\'' +

                    ", korea=" + korea +

                    ", english=" + english +

                    ", math=" + math +

                    '}';

        }


        public int getKorea() {

            return korea;

        }


        public int getEnglish() {

            return english;

        }


        public int getMath() {

            return math;

        }


        public String getName() {

            return name;

        }

    }


}





JAVA 2 >> collection 사용


public static void main(String args[]) throws Exception {

java.util.List<Node> nodeVOList = new java.util.ArrayList<Node>();
StringBuilder sb = new StringBuilder();
java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
int count = Integer.parseInt(br.readLine());


for (;count>0;count--) {
nodeVOList.add(new Node(br.readLine()));
}


java.util.Collections.sort(nodeVOList, Node.comparator);

for (Node vo : nodeVOList) {
sb.append(vo.getName() + "\n");
}
System.out.println(sb.toString());
}

public static class Node {
// data
String name;
int korean;
int english;
int math;

public Node(String name, int korean, int english, int math) {
this.name = name;
this.korean = korean;
this.english = english;
this.math = math;
}

public Node(String line) {
String[] spl = line.split(" ");
this.name = spl[0];
this.korean = Integer.parseInt(spl[1]);
this.english = Integer.parseInt(spl[2]);
this.math = Integer.parseInt(spl[3]);
}


@Override
public String toString() {
return "Node{" +
"name='" + name + '\'' +
", korea=" + korean +
", english=" + english +
", math=" + math +
'}';
}

private static java.util.Comparator<Node> comparator = new java.util.Comparator<Node>() {

public int compare(Node node1, Node node2) {
if (node1.getKorea() > node2.getKorea()) {
return -1;
} else if (node1.getKorea() == node2.getKorea()) {
if (node1.getEnglish() < node2.getEnglish()) {
return -1;
} else if (node1.getEnglish() == node2.getEnglish()) {
if (node1.getMath() > node2.getMath()) {
return -1;
} else if (node1.getMath() == node2.getMath()) {
if (node1.getName().compareTo(node2.getName()) < 0) return -1;
else return 1;
}
}
}
return 1;
}
};


public int getKorea() {
return korean;
}

public int getEnglish() {
return english;
}

public int getMath() {
return math;
}

public String getName() {
return name;
}
}


결과 

메모리 : 16940

시간 : 884



와우 






JAVA 3 >> StringTokenizer 사용


public Node(String line) {
java.util.StringTokenizer st = new java.util.StringTokenizer(line, " ");
this.name = st.nextToken();
this.korean = Integer.parseInt(st.nextToken());
this.english = Integer.parseInt(st.nextToken());
this.math = Integer.parseInt(st.nextToken());
}



25048 / 776 



흠..



JAVA 4 >> Getter 사용X

private static java.util.Comparator<Node> comparator = new java.util.Comparator<Node>() {

public int compare(Node node1, Node node2) {
if (node1.korean > node2.korean) {
return -1;
} else if (node1.korean == node2.korean) {
if (node1.english < node2.english) {
return -1;
} else if (node1.english == node2.english) {
if (node1.math > node2.math) {
return -1;
} else if (node1.math == node2.math) {
if (node1.name.compareTo(node2.name) < 0) return -1;
else return 1;
}
}
}
return 1;
}
};


25052 / 792


별로 상관 없는거로..;;;




JAVA 5 >> implements Comparable 사용

public static void main(String args[]) throws Exception {

StringBuilder sb = new StringBuilder();
java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
int count = Integer.parseInt(br.readLine());

Node[] nodeVOList = new Node[count];

for (int i=0;i<count;i++) {
nodeVOList[i]=(new Node(br.readLine()));
}


java.util.Arrays.sort(nodeVOList);

for (Node vo : nodeVOList) {
sb.append(vo.name + "\n");
}
System.out.println(sb.toString());
}

public static class Node implements Comparable<Node>{
// data
String name;
int korean;
int english;
int math;

public Node(String name, int korean, int english, int math) {
this.name = name;
this.korean = korean;
this.english = english;
this.math = math;
}

public Node(String line) {
java.util.StringTokenizer st = new java.util.StringTokenizer(line, " ");
this.name = st.nextToken();
this.korean = Integer.parseInt(st.nextToken());
this.english = Integer.parseInt(st.nextToken());
this.math = Integer.parseInt(st.nextToken());
}


@Override
public String toString() {
return "Node{" +
"name='" + name + '\'' +
", korea=" + korean +
", english=" + english +
", math=" + math +
'}';
}

public int compareTo(Node node2) {
if (this.korean > node2.korean) {
return -1;
} else if (this.korean == node2.korean) {
if (this.english < node2.english) {
return -1;
} else if (this.english == node2.english) {
if (this.math > node2.math) {
return -1;
} else if (this.math == node2.math) {
if (this.name.compareTo(node2.name) < 0) return -1;
else return 1;
}
}
}
return 1;
}
}



26216 / 772


이거도 별로 상관 없는거로..;;;







JAVA 6 >> compare수정

public int compareTo(Node node2) {
int result;

result = node2.korean - this.korean;
if(result != 0){
return result;
}

result = this.english - node2.english;
if(result != 0){
return result;
}

result = node2.math - this.math;
if(result != 0){
return result;
}
return this.name.compareTo(node2.name);
}



25144 / 700



오 둘다 줄엇다 :D





JAVA 6 >> compare수정


 public int compareTo(Node node2) {

            if(this.korean == node2.korean && this.english == node2.english && this.math == node2.math) {

return this.name.compareTo(node2.name);

}else if(this.korean == node2.korean && this.english == node2.english) {

return (node2.math- this.math);

}else if(this.korean == node2.korean) {

return (this.english - node2.english);

}else {

return (node2.korean-this.korean);

}

        }


결과 : 25016 / 716



재밋는 방법이 잇길래 사용해봄


결과는 비슷



반응형

'Develope > 알고리즘' 카테고리의 다른 글

[알고스팟] XHAENEUNG  (5) 2017.12.11
[알고스팟] DIAMONDPATH  (2) 2017.12.11
[알고스팟] Quantization  (0) 2017.12.04
[알고스팟, 백준 9663] N-Queen  (0) 2017.12.04
[백준-9012] 괄호  (2) 2017.11.29