today_is

알고리즘 - 연탄의 크기 ( Lv. 2 / java) 본문

카테고리 없음

알고리즘 - 연탄의 크기 ( Lv. 2 / java)

ye_rang 2024. 6. 24. 00:21

https://softeer.ai/practice/7628

 

Softeer - 현대자동차그룹 SW인재확보플랫폼

 

softeer.ai

 

 

오늘은 프로그래머스 대신에,

 

실제 기업에서 나올 법한 문제를 풀어보았다 !

 

 

 

 

코드

import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int num = sc.nextInt();
        int arr[] = new int[num];
        
        for(int i=0; i < num; i++) {
            arr[i] = sc.nextInt();
        }

        HashMap<Integer, Integer> map = new HashMap<>();

        for(int i=0; i < num; i++) {
            for(int j=2; j <= arr[i]; j++) {
                if(arr[i] % j == 0) {
                    map.put(j, map.getOrDefault(j, 0) + 1);
                }
            }
        }
        int answer = Collections.max(map.values());

        System.out.print(answer);
    }
}

 

 

 

한 줄씩 해석

 

scanner 객체를 만든다

 

num 변수에 첫번째 입력값인, 집의 개수를 받아온다

 

num 만큼 arr배열을 만든다

 

for문을 이용하여, 난로의 반지름 값을 받아온다 {

       받아온 값은 arr에 넣어둔다

}

 

Interger, Integer 형태로 HashMap 객체를 만든다

 

for문을 이용하여, num 까지 i++ {

       for문을 이용하여, arr[i] 까지 j++ {

                만약, arr[i]가 j로 나누어진다면 {

                      map.put으로   key는 j , value는 약수의 개수를 담는다

                }

       }

}

 

map의 value값 중에서 가장 큰 수를 answer에 담기

 

answer 출력 

 

 


틀린 부분

첫번째 시도 - 배열로 풀기

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int num = sc.nextInt();
        int[] arr = new int[num];

        for (int i = 0; i < num; i++) {
            arr[i] = sc.nextInt();
        }

        int answer = 0;

        for (int i = 0; i < num; i++) {
            int check = 0;
            for (int j = 0; j < num; j++) {
                if (arr[i] >= 2 && arr[j] % arr[i] == 0) {
                    check++;
                }
            }
            if (answer < check) {
                answer = check;
            }
        }

        System.out.print(answer);
        sc.close();
    }
}

 

 

 

처음에는 배열로도 충분히 풀 수 있을 것 같아서 배열로 풀었는데

 

계속 테스트 케이스 9와 20번만 오답이라고 떴다

 

이유도 모르겠고 배열로 푸는게 비효율적인 것 같아서 

 

 

 

좀 더 직관적으로 생각할 수 있는  HashMap으로 바꿔서 풀었다.

 

근데 또 똑같이 9번과 20번이 오답이라고 떴다

 

 

 

 

방식을 바꿨는데도 같은 테스트 케이스에서 오답이라는 것은

 

내가 문제를 잘못이해하고 푼 것 일수도 있겠다는 생각이 들었다

 

 

 

 

주어진 arr배열에서 약수가 될 수 있는 수를 구하는게 아니라,

 

주어진 arr배열 중에서 약수를 많이 가지고 있는 수를 구해야 하는 것임을 이제서야 알았다. 

 

다시 바꿔서 풀었더니 바로 정답으로 떴다

 

문제를 제대로 이해하는 것도 참 중요하다....