-
[ SWEA ] 1204, 1206, 9611Java/코딩테스트 2023. 5. 17. 17:14
1204 : 1000명의 학생들의 점수를 보고 가장 많이 등장한 점수 꺼내기
-> HashMap 사용해서 풀었다.
학생의 점수 + 빈도 수를 key, value 값으로 넣어두기 / map은 같은 key값이 들어오면 나중에 들어온 value로 덮어씌운다.
기존에 있던 빈도 수 scores.get() + 1해서 빈도수 + 1
이때 Map을 정렬해야 하는데, 문제 조건은 2가지가 있다.
1. 가장 많이 등장한 점수
2. 빈도수가 같은 점수가 있을 경우, 더 높은쪽을 선택.
Map 자료구조에서 map.entrySet() : map의 모든 Key, Value 꺼낸다.
ArrayList로 꺼내도 되고 LinkedList로 꺼내도 된다. 돌려보니 ArrayList가 메모리를 더 쓰고 시간을 덜 쓰는 것 같다. LinkedList는 메모리를 덜 쓰고 시간을 조금 더 씀. 이건 둘의 특징 차이 때문이긴 하지만 ... 이 둘의 자료구조 상 특징은 나중에 따로 정리해야지
import java.util.*; public class Solution { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int test = sc.nextInt(); for (int i = 0; i < test; i++) { Map<Integer, Integer> scores = new HashMap<>(); for (int j = 0; j <= 100; j++) { scores.put(j, 0); } int num = sc.nextInt(); // 테스트케이스 번호 for (int j = 0; j < 1000; j++) { int temp = sc.nextInt(); scores.put(temp, scores.get(temp) + 1); } List<Map.Entry<Integer, Integer>> entries = new LinkedList<>(scores.entrySet()); entries.sort((o1, o2) -> { if (o1.getValue() == o2.getValue()) { return o2.getKey() - o1.getKey(); } return o2.getValue() - o1.getValue(); }); System.out.println("#" + num + " " + entries.get(0).getKey()); } } }
1206 : View
- 배열에 각 빌딩 정보들을 저장해두고, 자기 기준 양 옆 2칸씩 보니까 5칸짜리 슬라이딩 윈도우 방식으로 탐색
- 시작 2칸과 끝 2칸이 0이므로, 2부터 빌딩개수 - 3까지 탐색 (빌딩번호 0 ~ 빌딩개수-1이라고 생각할 때)
- 자기 자신 양 옆 2칸씩 본다. 1 3 9 5 6 이런식으로 되어있으면 9(자기자신)이 가장 max이므로 조망권 확보 됨. 다음으로 높은 빌딩이 6층짜리이므로 9-6 = 3, 총 3칸의 조망권 확보
- 1 4 2 1 1 이런식이면 2(자기자신)이 max가 아니므로 조망권 확보 불가.
- 5칸짜리에 자기자신 + 양옆 2칸 넣어두고, 내가 max라면 그 다음으로 큰 애 빼주면 된다.
- int[]를 Collections.reverseOrder()로 역순 정렬 하려면 Integer[] 로 변경해줘야 함. 근데 어차피 오름차순 정렬하고 끝에서 2개빼면 되는거라 그냥 Arrays.sort 사용함.
import java.io.*; import java.util.Arrays; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); for (int t = 1; t <= 10; t++) { int answer = 0; StringTokenizer st = new StringTokenizer(br.readLine()); int building = Integer.parseInt(st.nextToken()); int[] arr = new int[building]; st = new StringTokenizer(br.readLine()); for (int i = 0; i < building; i++) { arr[i] = Integer.parseInt(st.nextToken()); } for (int i = 2; i < building-2; i++) { int[] temp = Arrays.copyOfRange(arr, i-2, i+3); Arrays.sort(temp); if (temp[4] == arr[i]) { answer += (temp[4] - temp[3]); } } System.out.println("#" + t + " "+answer); } } }
9611 : 명진이와 동휘의 숫자 맞추기
아이디어가 생각이 안나서 고민하고 있었는데 문제 댓글에 달려있던 아이디어 보고 해결...
방문 처리를 따로 해야하나 그 생각하고 있었는데... 이렇게 풀게 되었다.
import java.io.*; import java.util.*; public class Solution { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int test = Integer.parseInt(st.nextToken()); for (int t = 1; t <= test; t++) { st = new StringTokenizer(br.readLine()); int query = Integer.parseInt(st.nextToken()); int[] answer = new int[10]; Arrays.fill(answer, 1); for (int i = 0; i < query; i++) { st = new StringTokenizer(br.readLine()); int a = Integer.parseInt(st.nextToken()); int b = Integer.parseInt(st.nextToken()); int c = Integer.parseInt(st.nextToken()); int d = Integer.parseInt(st.nextToken()); String included = st.nextToken(); if (included.equals("YES")) { answer[a] *= 2; answer[b] *= 2; answer[c] *= 2; answer[d] *= 2; } else { answer[a] = answer[b] = answer[c] = answer[d] = 0; } } int index = 0; int max = -111; for (int i = 0; i < 10; i++) { if (answer[i] > max) { max = answer[i]; index = i; } } System.out.println("#" + t + " " + index); } } }
'Java > 코딩테스트' 카테고리의 다른 글
백준 7569, 2573 - Java (0) 2023.05.26 [ SWEA ] 1954 (0) 2023.05.19 HackerRank - PriorityQueue (0) 2023.05.11 프로그래머스 여행경로 Java (0) 2023.05.04 프로그래머스 디스크 컨트롤러 - Java (feat 우선순위 큐) (0) 2023.04.27