[계획]
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 로그인기능으로 연동시켜보려고 한다.
'2022-winter-mogakko' 카테고리의 다른 글
2022-모각코 6차시 활동 계획 및 결과 (0) | 2022.02.04 |
---|---|
2022-모각코 5차시 활동 계획 및 결과 (0) | 2022.02.04 |
2022-모각코 3차시 활동 계획 및 결과 (0) | 2022.02.04 |
2022-모각코 2차시 활동 계획 및 결과 (0) | 2022.02.04 |