ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ SWEA ] 1204, 1206, 9611
    Java/코딩테스트 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
Designed by Tistory.