Java/패스트캠퍼스

패스트캠퍼스 자바 알고리즘 문제

hs_developer 2022. 5. 17. 00:17

1. 나열된 수에서 최소값과 최대값 구하기

 

배열에 있는 수 중 맨 처음에 있는 값을 max와 min으로 가정하고, 배열의 마지막 숫자까지 비교하면서 더 큰 수나 더 작은 수가 나올 때까지 max와 min의 값으로 바꾸도록 한다.

그 때의 위치를 변수에 저장한다.

 

 

가장 큰 값은 101이고, 위치는 5번째입니다.
가장 작은 값은 2이고, 위치는 4번째입니다.
public static void main(String[] args) {
		
    int[] numbers = {10, 55, 23, 2, 79, 101, 16, 82, 30, 45};

    int min = numbers[0]; // 최소값 0번째부터 찾는다
    int max = numbers[0];

    int minPos = 0; // 순서
    int maxPos = 0;

    for(int i=1; i<numbers.length; i++)
    {
        if(min > numbers[i]) 
        {
            min = numbers[i];
            minPos = i+1; // 이렇게 하면 실제 순서에서 1이 더해지는데..
        }

        if(max < numbers[i]) // 모두 적용되므로 else if 쓰지 않는다
        {
            max = numbers[i];
            maxPos = i; // 왜 maxPos는 i+1이 아닌가??
        }

    }

    System.out.println("가장 큰 값은 " + max + "이고, 위치는 " + maxPos + "번째입니다.");
    System.out.println("가장 작은 값은 " + min + "이고, 위치는 " + minPos + "번째입니다.");

}

 

 

 

문제 풀이_랜덤

 

[25, 30, 14, 3, 35, 27, 29, 36, 2, 25]
가장 큰 값은 36이고, 위치는 7번째입니다.
가장 작은 값은 2이고, 위치는 8번째입니다.
public static void main(String[] args) {
		
    int[] numbers = new int[10];

    for(int i=0; i<numbers.length; i++)
    {
        numbers[i] = (int)(Math.random()*50)+1;
    }

    int min = numbers[0]; // 최소값 0번째부터 찾는다
    int max = numbers[0];

    int minPos = 0; // 순서
    int maxPos = 0;

    for(int i=1; i<numbers.length; i++)
    {
        if(min > numbers[i]) 
        {
            min = numbers[i];
            minPos = i; // min도 i로 해야 순서에 맞는 듯
        }

        if(max < numbers[i]) // 모두 적용되므로 else if 쓰지 않는다
        {
            max = numbers[i];
            maxPos = i;
        }

    }

    System.out.println(Arrays.toString(numbers));
    System.out.println("가장 큰 값은 " + max + "이고, 위치는 " + maxPos + "번째입니다.");
    System.out.println("가장 작은 값은 " + min + "이고, 위치는 " + minPos + "번째입니다.");

}

 

 

 

2. 정렬된 수에서 하나의 수 위치 찾기

 

수가 정렬 된 상태이므로 중간 값을 하나 선택한다. 찾으려는 값이 그보다 크면 범위를 오른쪽으로, 작으면 범위를 왼쪽으로 좁힌다.

한번 비교할 때마다 1/2씩 범위가 좁혀진다.

 

 

찾는 수는 10번째 있습니다.
public static void main(String[] args) {

    int[] numbers = {12, 25, 31, 48, 54, 66, 70, 83, 95, 108};

    int target = 108;

    int left = 0; // 맨 왼쪽
    int right = numbers.length-1; // 맨 오른쪽
    int mid = (left+right)/2;

    int tmp = numbers[mid]; // 비교 할 내용
    boolean find = false; // 수 찾았는지 여부

    while(left <= right) // left가 right보다 작거나 같은 동안
    {
        if(target == tmp)
        {
            find = true; // 수를 찾은 경우
            break; // 멈춘다
        }

        else if(target < tmp) // 찾으려는 수가 더 작은 경우
        {
            right = mid-1; // 맨 오른쪽에서 -1
        }

        else // 찾으려는 수가 더 큰 경우
        { 
            left = mid+1; // 맨 왼쪽에서 +1
        }

        mid = (left+right)/2;
        tmp = numbers[mid]; // tmp = numbers의 mid번째
    }

    if(find == true)
    {
        mid++;
        System.out.println("찾는 수는 " + mid + "번째 있습니다.");
    }

    else
        System.out.println("찾는 수가 없습니다.");

}

 

 

옵션 추가 

 

1. 배열 수 랜덤으로 출력 (중복 X)

2. 찾는 수 Scanner 입력

 

 

public static void main(String[] args) {
		
    // 난수 출력
    int[] numbers = new int[10];
    int su=0;
    boolean bCheck=false;

    // 중복 제거
    for(int i=0; i<numbers.length; i++)
    {
        bCheck=true;
        while(bCheck)
        {
            su = (int)(Math.random()*50)+1;
            bCheck = false;

            for(int j=0; j<i; j++)
            {
                if(numbers[j]==su)
                {
                    bCheck=true;
                    break;
                }
            }
        }
        numbers[i]=su;

    }

    Arrays.sort(numbers);
    System.out.println(Arrays.toString(numbers));

    // 찾는 수 입력
    Scanner sc = new Scanner(System.in);

    System.out.println("찾으려는 수: ");
    int target = sc.nextInt();

    // 입력한 수 찾기
    int left = 0; 
    int right = numbers.length-1; 
    int mid = (left + right)/2;

    int temp = numbers[mid]; // 비교할 수
    boolean find = false; // 수 찾았는지 여부

    while(left <= right) // 오름차순 조건(기본 조건??)
    {
        if(target == temp) // 수를 찾은 경우
        {
            find = true;
            break;
        }

        else if(target < temp) // 찾으려는 수가 더 작은 경우
        {
            right = mid-1;
        }

        else
        {
            left = mid+1;
        }

        mid = (left+right)/2;
        temp = numbers[mid]; // mid가 바뀌었으니 재조정`
    }

    if(find == true) // 수를 찾는 경우
    {
        mid++; // 실제 배열 수에 맞추기 +1
        System.out.println("찾는 수는 " + mid + "번째에 있습니다.");
    }

    else
        System.out.println("찾는 수가 없습니다.");

}

 

 

 

3. 특정 범위의 숫자 배열에 있는 각 숫자 개수 세기

 

M 이상 N 이하의 수가 순서 없이 나열 되었을 때 각 수가 몇 개인지 세기.
연령대에 따른 인원을 체크할 수 있다.

 

10명 중 20대는 2명입니다.
.
.
10명 중 80대는 1명입니다.
10명 중 90대는 1명입니다.
public static void main(String[] args) {
		
    int[] people = {55, 40, 27, 99, 76, 81, 29, 31,33, 62}; 
    int[] ages = new int[10]; // 연령대

    for(int i=0; i<people.length; i++)
    {
        int age = people[i]; // 연령

        if(age < 30) 
            ages[0]++;
        else if(age < 40)
            ages[1]++;
        else if(age < 50)
            ages[2]++;
        else if(age < 60)
            ages[3]++;
        else if(age < 70)
            ages[4]++;
        else if(age < 80)
            ages[5]++;
        else if(age < 90)
            ages[6]++;
        else if(age <= 100)
            ages[7]++;
    }

    int number = people.length;

    System.out.println(number + "명 중 20대는 " + ages[0] + "명입니다.");
    System.out.println(number + "명 중 30대는 " + ages[1] + "명입니다.");
    System.out.println(number + "명 중 40대는 " + ages[2] + "명입니다.");
    System.out.println(number + "명 중 50대는 " + ages[3] + "명입니다.");
    System.out.println(number + "명 중 60대는 " + ages[4] + "명입니다.");
    System.out.println(number + "명 중 70대는 " + ages[5] + "명입니다.");
    System.out.println(number + "명 중 80대는 " + ages[6] + "명입니다.");
    System.out.println(number + "명 중 90대는 " + ages[7] + "명입니다.");

}