본문 바로가기

2022-winter-mogakko

2022-모각코 4차시 활동 계획 및 결과

[계획]

1. 백준 실버 5 이상의 문제로 2문제 풀기.

2. 채팅창 기능 중 서버부분 공부하고 구현해보기.

   (구현은 오늘완성이 목표 x)


[회고]

1. 백준문제 2108번 : 통계학 문제를 풀었다.

  문제 : https://www.acmicpc.net/problem/2108

 

2108번: 통계학

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

www.acmicpc.net

입력받은 숫자의 기하평균, 중간값, 최빈값, 범위를 출력하는 문제다.

입력은 배열에 하나하나 입력을 받아주었다.

 

 - 기하평균 : sum / 입력받은 개수

     배열에 하나하나 입력받을 때 sum을 해주었고, 입력을 다 받은 뒤에 sum을 배열의 크기로 나눠 소숫점 둘째자리에       서 반올림해주었다.

 

 - 중간값

     입력값의 개수는 홀수개를 받으라는 문제의 조건에 맞춰 생각해보면 배열의 크기를 2로 나눈 부분의 값이 중간값이       된다. 만약 입력을 1, 2, 3, 4, 5 를 받았다면 중간값은 배열의 크기 5 / 2 = 2이므로 배열의 3번째 값이 중간값이 된         다. (num[0], num[1], num[2], num[3], num[4] 이므로 num[2]는 3번째 값)

 

 - 범위

     범위는 입력받은 값을 정렬시켜준 후 가장 큰값과 가장 작은값을 빼주면 입력값들의 범위를 구할 수 있다.

 

 - 최빈값

     입력을 받을 때 입력받는 값을 index로 하여 배열에 1씩 더해주었다. (ex) 1 3 5 3 6 을 입력받았다면 각각의 입력값       들을 index로 생각해 arr[1]++, arr[3]++ .... 이런식으로 그 수 위치의 배열에 값을 1씩 더해줌.)

     가장 많이 나온 횟수를 max에 저장해 놓은 뒤 그 max와 배열의 값을 비교해 max와 같다면 list에 넣어주었다. 

     그 후 list의 size가 1이라면 최빈값은 유일하기때문에 list의 값을 출력해주었고, 만약 size가 1이 아니라면 최빈값은       유일하지 않기 때문에 문제에서 주어진 조건에 따라 최빈값 중 두번째로 작은 값을 출력시키면 되므로 list를 오름차       순으로 정렬 후 두번째 값을 출력해주었다.

 

이렇게 4개의 값들을 출력해줘 문제를 해결하였다. 아래는 전체코드이다.

import java.util.*;

public class average_2108_0118 {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);

        int N = sc.nextInt(); // N은 홀수
        int[] num = new int[N];
        int[] arr = new int[8001]; // 최빈값을 찾기위한 배열
        ArrayList<Integer> list = new ArrayList<>();
        int sum = 0;
        double average = 0; // 산술평균 = sum/N
        int middle_num = 0; // 중앙값
        int often_num = 0; // 최빈값
        int boundary = 0; // 범위

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

        Arrays.sort(num); // 오름차순 정렬

        int max = Integer.MIN_VALUE;
        for(int i = 0; i < arr.length; i++){
            if(arr[i] >= max){
                max = arr[i];
            }
        }
        for(int i = 0; i < arr.length; i++){
            if(arr[i] == max){
                list.add(i-4000);
            }
        }
        if(list.size() == 1){
            often_num = list.get(0);
        }
        else{
            Collections.sort(list);
            often_num = list.get(1);
        }

        average = Math.round((double) sum/N);
        middle_num = num[N/2];
        boundary = num[N-1] - num[0];

        System.out.println((int) average);
        System.out.println(middle_num);
        System.out.println(often_num);
        System.out.println(boundary);


        sc.close();
    }
}

2. 백준문제 11899번 : 괄호 끼워넣기 문제를 풀었다.

  문제 : https://www.acmicpc.net/problem/11899

 

11899번: 괄호 끼워넣기

첫 번째 줄에 S를 올바른 괄호열으로 만들기 위해 앞과 뒤에 붙여야 할 괄호의 최소 개수를 출력합니다. 불가능한 경우는 주어지지 않습니다.

www.acmicpc.net

입력받은 괄호문자열을 전부 ()꼴로 나타내기 위해 추가하는 괄호의 최솟값을 구하는 문제였다.

이 문제는 여는괄호("(")의 갯수를 세준 후 여는괄호가 현재까지 몇번 나왔는지 구해준 후 닫는괄호(")")를 생각해주었다.

입력받은 배열의 처음부터 생각을 할 때

 

1. 입력받은 값이 여는괄호라면 :

    count를 1 더해주고, 닫히지 않은 여는괄호가 현재 몇개가 있는지 알려주는 opencount를 1 더해주었다.

 

2. 입력받은 값이 닫는괄호라면 : 두가지 경우로 나누어서 생각해주었다.

    1) 입력받은 값이 닫는괄호이면서 opencount가 0이라면 : count를 1 올려주었다.

    2) opencount가 0이 아니라면 : opencount를 1 빼주고 count도 1을 빼주었다.

          count도 1을 빼주는 이유는 닫는괄호가 하나 있으면 그 전에 여는괄호를 닫기 위해 추가되는 괄호도 필요가 없            어지므로 count를 1 빼주는것이다.

 

이렇게 한 뒤 count를 출력해주게 되면 괄호끼워넣기 문제 해결.

import java.util.*;

public class gwalho_11899_0118 {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);

        String[] S = sc.nextLine().split("");
        int count = 0;
        int opencount = 0;
        for(int i = 0; i < S.length; i++){
            if(S[i].equals("(")){
                count++;
                opencount++;
            }
            else{
                if(opencount == 0){
                    count++;
                }
                else{
                    opencount --;
                    count--;
                }
            }
        }
        System.out.println(count);
        sc.close();
    }
}

3. 채팅창 中 서버부분 공부하기 -> flutter로 채팅앱 구현해보기.

   계획을 java로 구현하는 것이 아니라 flutter로 구현해보기로 바꿔봤다.

   그리고 오늘 50분동안 flutter로 채팅앱을 만드는 영상을 찾아봤다.

   그 영상에서 하는 것처럼 하드코딩으로 채팅앱을 만드는 것을 따라하고있는데 

   다음주에는 firebase와 연동시켜서 채팅이 되도록 해보고싶다.

   그리고 채팅에는 계정정보가 있어야하기 때문에 지난번 1월에 만들었던 로그인기능 + flutter에서 제공하는 google       로그인기능으로 연동시켜보려고 한다.