[백준-10825] 국영수
도현이네 반 학생 N명의 이름과 국어, 영어, 수학 점수가 주어진다. 이 때, 다음과 같은 조건으로 학생의 성적을 정렬하는 프로그램을 작성하시오.
- 국어 점수가 감소하는 순서로
- 국어 점수가 같으면 영어 점수가 증가하는 순서로
- 국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로
- 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
1 초 | 256 MB | 3539 | 1423 | 1067 | 41.325% |
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 |