-
이거 풀다가 시간을 너무 많이 보냈다.......
예제 입력을 배열로 받을까, ArrayList로 받을까 HashMap으로 받을까
계속 수정하다가 시간이 너무 많이 가버렸다.
그 이유는, 등수가 이미 매겨진 국가는 이제 더 이상 순위를 매기면 안 되니깐
아예 삭제해버릴까, 아니면 삭제하지 말고 메달 획득수를 -1로 모두 바꿔서
순위 매길때 고려 대상이 아니게 해버릴까 고민했다.
결국 삭제를 선택하고,
ArrayList가 이 작업이 쉬워서 선택했지만
또 정렬이 문제였다.
그래서 키, 값으로 받는 HashMap는 정렬이 쉬우니깐, 사용하려 했지만
(국가번호 1,2,3,4 순으로 정렬하려고 했다. 그래야 계산이 편해져서)
문제는, 만약 인덱스 0인 데이터들을 삭제하면 뒤에 있는 데이터들이 인덱스 0으로 댕겨져 오는게 아니라
그대로 있어서 사용하기 불편하고..
그래서 그냥 포기하고,,
다른 사람의 코드를 참고하기로 했다.
아직 지식과 능력이 부족해서 그런 듯 해서 열심히 하겠다!!
그래서 지금까지 시행착오하면서 배웠던 내용들을 적는다.
1. ArrayList 내부에 ArrayList를 또 받을 때.
즉 예제에 나온 것처럼
1 1 2 0
2 0 1 0
3 0 1 0
4 0 0 1
을 2차원의 ArrayList로 받을 때
우선
1 1 2 0 , 2 0 1 0, 3 0 1 0, 4 0 0 1을
각각 ArrayList al로 받은 뒤
이 4개를 ArrayList <ArrayList<Integer>> nation에 넣으면 된다.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { BufferedReader br= new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine(), " "); int N = Integer.parseInt(st.nextToken()); int M = Integer.parseInt(st.nextToken()); ArrayList<ArrayList<Integer>> nation = new ArrayList<ArrayList<Integer>>(); for(int i=0; i<N;i++) { StringTokenizer st1 = new StringTokenizer(br.readLine(), " "); ArrayList<Integer> al = new ArrayList<Integer>(); for(int j=0; j<N;j++) { al.add(Integer.parseInt(st1.nextToken())); } nation.add(al); } for(ArrayList<Integer> a : nation) { System.out.println(a); } }}
이렇게 하면 된다.
System.out.println(nation.get(0).get(1));
이렇게 하면 결과값이 1이 나오며,
이건 (0,1) 번째 값이 나온 것이다.
참고 자료 :
https://earthconquest.tistory.com/82
[JAVA] 11/24 (1)| 2차원 ArrayList, Arrays클래스, File패키지, NIO파일과 디렉토리, IO패키지
정리 자료구조 1. 집합임시저장 List - 순서, 중복허용(배열 확장) - ArrayList(Vector) Set - 순서가 없고, 중복 불허용 - 향상된 for / Iterator - HashSet Map - 키, 값 구조 - 키만 가져올 지 / 값만 가져올..
earthconquest.tistory.com
만약 예제값을 HashMap으로 받으려 한다면
4 2
1 3 0 0
3 0 0 2
4 0 2 0
2 0 2 0
우선
int number 로는 1을 받고
ArrayList<Integer> al 로 3 0 0 을 받는다
그래서 Map<Integer, ArrayList<Integer>>nation = new HashMap<>(); 로
nation.put(number, al);
이렇게 받으면 된다.
참고 자료 :
[JAVA] Map에 배열/List 넣기 (Object형 사용)
[ 상품 규격표 컴포넌트 개선 작업 ] 위 표를 그리는 규격표 컴포넌트를 Dialog를 통해 데이터 수정이 불가능 하도록 개선해야 하는데~~~~~ 이것과 비슷한 기존의 다른 컴포넌트는 그냥 하나의 HTML
elena90.tistory.com
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine(), " "); int N = Integer.parseInt(st.nextToken()); int M = Integer.parseInt(st.nextToken()); Map<Integer, ArrayList<Integer>> nation = new HashMap<>(); for(int i=0; i<N; i++) { StringTokenizer st1 = new StringTokenizer(br.readLine(), " "); int number = Integer.parseInt(st1.nextToken()); ArrayList<Integer> al = new ArrayList<Integer>(); for(int j=0;j<N-1;j++) { al.add(Integer.parseInt(st1.nextToken())); } nation.put(number, al); } for(Integer a : nation.keySet()) { ArrayList<Integer> b = nation.get(a); System.out.println(a+":"+b); } } }
이렇게 받으면 된다.
그러면
이렇게 출력값이 나온다.
그리고 여기서는 HashMap이 Key값에 의해 자동정렬 해서 나왔지만,
제대로 해줘야 한다고 한다.
그래서 정렬해주려면
Object[] order = nation.keySet().toArray(); Arrays.sort(order);
이렇게 하면 된다.
참고 자료 :
https://devmoony.tistory.com/95?category=860335
[Java] HashMap 키(key) / 값(value) 기준으로 정렬하는 방법
HashMap 정렬하기 TreeMap을 사용하면 데이터를 저장할 때 키(key)로 자동 정렬을 해주지만 HashMap은 정렬하는 방법을 이용해야 합니다. HashMap을 정렬하기 위해 java.util.Arrays - Arrays.sort 메서드를 사용..
devmoony.tistory.com
역시 이런 결과가 나온다.
HashMap은 인덱스가 아니라
Key값으로 값추출을 하기 때문에
nation.get(1).get(0);
하면, key값이 1인 3,0,0 중에 첫번째(get(0)) 값인 3이 출력된다.
System.out.println(nation.get(1).get(0)); System.out.println(nation.get(1).get(1)); System.out.println(nation.get(1).get(2));
이렇게 코드를 만들면 결과는
이렇게 나온다.