코딩테스트 & 알고리즘 및 기타/백준_알고리즘 - 단계별 풀이

[Java, 자바] 백준 알고리즘 - 단계별 풀기 (5단계)

정데브 2021. 5. 19. 14:37

5단계 1차원 배열

 

 

10818번 

  •  N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.
  • 첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분
  • 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.
package step5;

import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

public class NO_1 {

	public static void main(String[] args) throws IOException {

		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

		
		int n=Integer.parseInt(br.readLine());
		int arr[]=new int[n];//입력받은 n크기의 배열 생성
		
		
		// 비교할 데이터 입력
		StringTokenizer st=new StringTokenizer(br.readLine()," ");
		
		for(int i=0;i<arr.length;i++) {
			arr[i]=Integer.parseInt(st.nextToken()); //배열에 값 넣어줌
		}
		br.close(); //입력 종료
		Arrays.sort(arr);  //소트 정렬 작은거 >> 큰 순
		System.out.println(arr[0]+" "+arr[n-1]);  //가장 큰수 배열의 끝에 위치하는 데이터 출력

	}

}

 

 

 

2562번 

  • 9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.
  • 예를 들어, 서로 다른 9개의 자연수 3, 29, 38, 12, 57, 74, 40, 85, 61이 주어지면, 
  • 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.
package step5;

import java.io.*;
import java.util.Arrays;

public class NO_2 {

	public static void main(String[] args) throws IOException {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));


		int arr[]=new int[9];  //크기 9만큼의 배열 생성
		int max=0;  //max값 저장 공간
		int number = 0; //max의 위치를 저장할 공간
		int count=0;
				
		for(int i=0;i<9;i++) {
			arr[i]=Integer.parseInt(br.readLine());  //배열에 값 입력
			
		}
		
		for(int x:arr) {
			count++;
			if(x>max) {  //x의 값중 가장 큰것을
				max=x;   //max변수에 넣음
				number=count;  //카운트를 통해 위치를 넘김
			}
		}
		br.close();
		System.out.println(max);
		System.out.println(number);

	}

}

 

 

 

 

2577번 

  • 세 개의 자연수 A, B, C가 주어질 때 A × B × C를 계산한 결과에 0부터 9까지 
  • 각각의 숫자가 몇 번씩 쓰였는지를 구하는 프로그램을 작성하시오.
  • 예를 들어 A = 150, B = 266, C = 427 이라면 
  • A × B × C = 150 × 266 × 427 = 17037300 이 되고, 
  • 계산한 결과 17037300 에는 0이 3번, 1이 1번, 3이 2번, 7이 2번 쓰였다.
package step5;

import java.io.*;
import java.util.Arrays;


public class NO_3 {

	public static void main(String[] args) throws IOException {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		
		int A=Integer.parseInt(br.readLine());
		int B=Integer.parseInt(br.readLine());
		int C=Integer.parseInt(br.readLine());
		int num=A*B*C;  //입력받은 3개의 수의 합을 num에 넣음
		
		String str=Integer.toString(num);  //int형 num의 값을 string으로 캐스팅해줌
		
		char[] arr=str.toCharArray(); //문자열 str을 char배열에 넣음
		
		int []number=new int[10]; 	// 0~9까지 몇번이 나왔는지에 대한 값을 담을 배열 선언
		
		// arr배열에 num 값 17037300 의 수가 담겼다고 가정
		// 각 자리수를 구하기 위해서는 나머지(%10)을 통해서 1의 자리씩 가져와야함
		// number 배열의 index를 통해서 값을 넣을 것. 
		// 첫번째 num%10을 통해 0이 나옴 = number[num%10] 인덱스를 의미.
		// 이때 number[0] 번의 값을 ++증가 시키면 배열 0번째 즉, 0의 값이 1임을 넣게되는 것 
		// 증가시킨 후에는 다음 숫자를 찾기 위해 이미 추가한 첫번째 자리수를 지워야함
		// 그렇기에 num의 값을 10으로 계속 나눠줘야함
		
		for(int i=0;i<arr.length;i++) {
			number[num%10]++;   //나눈 값 즉, 1의 자리를 비교함 0~9중에 있는 값에 증가함
			num/=10;  //나머지를 뺀 다음 10으로 다시 나눔
		}
		
		for(int x:number)  //배열의 값을 꺼내기 위한 반복문
			System.out.println(x);
	}

}

 

 

 

 

1546번 

  • 입력된 점수중 가장 큰값을 M
  • M보다 작은점수들은  점수/M*100으로 수정 후 평균 구하기
  • 첫째 줄에 새로운 평균을 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-2 이하이면 정답이다. 
package step5;

import java.util.Scanner;

public class NO_4 {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		
		int data=in.nextInt();
		double []arr=new double[data];  //입력받은 값만큼 배열크기 지정
		
		double max=0;  //선언 및 초기화
		double sum=0;  //선언 및 초기화
		
		for(int i=0;i<arr.length;i++) {
			arr[i]=in.nextDouble();  //배열에 넣음과 동시에 max값을 정해줌
			if(arr[i]>max)
				max=arr[i];
		}
		for(int i=0;i<arr.length;i++) {  //배열의 길이만큼 반복
			arr[i]=arr[i]/max*100;  //배열에 있는 값에 /max*100을 해준 후 다시 넣음
			sum+=arr[i];  //모든 배열의 값을 sum변수에 더함
		}
		System.out.println(sum/data);  //변수 갯수만큼 나눠 평균 출력
	}
}

 

 

 

 

8958번 

  • "OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.
  • "OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.
  • 각 테스트 케이스마다 점수를 출력한다.
package step5;

import java.util.Scanner;

public class NO_5 {

	public static void main(String[] args)  {
		/*
		 * n길이의 스트링 배열필요
		 */
		Scanner in=new Scanner(System.in);
		
		int data=in.nextInt();
		String arr[] =new String[data];
		
		for(int i=0;i<data;i++) {  //입력받은 데이터만큼 반복 실행
			arr[i]=in.next();  //배열에 값 입력
			int cnt=0;   //연속으로 나오는 횟수를 체크
			int sum=0;   //횟수에 대한 값을 더하는 공간
			for(int j=0;j<arr[i].length();j++) {
				if(arr[i].charAt(j)=='O')  //문자 배열 index에 있는 문자 한개를 꺼내서 체크 
					cnt++;     //만약 O가 있으면 카운트 증가 //X가 나올때까지 증가함
				else
					cnt=0;  //만약 X가 먼저 나온다면 cnt변화 없음 0처리
				sum+=cnt;  //최종적인 카운트의 값을 더함
				}
			System.out.println(sum); //각 index에서 가지고있는 sum값을 출력
			}
		in.close();
	}			
}	

 

 

 

 

 

 

4344번 

  • 첫째 줄에는 테스트 케이스의 개수 C가 주어진다.
  • 둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.
  • 각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다
package step5;

import java.util.Scanner;

public class NO_6 {

	public static void main(String[] args)  {
		Scanner in =new Scanner(System.in);
		int T=in.nextInt();  // 몇개의 케이스를 진행할 것인지
		
		for(int i=0;i<T;i++) {   //입력받은 T만큼 진행

			int num=in.nextInt();
			int arr [] =new int [num];  // 입력받은 수 만큼의 배열 크기 지정
			int sum=0, avg=0,cnt=0;   //변수 선언 및 초기화

			for(int j=0;j<num;j++) {  //배열의 크키만큼 반복
				arr[j]=in.nextInt();  //해당 위치에 값 입력
				sum+=arr[j];   //배열의 값들을 sum에 저장
			}

			avg=sum/num;    //평균 구하기
			
			for(int q=0;q<num;q++) {
				if(arr[q]>avg) {  //배열의 값이 평균보다 크다면
					cnt++;        //카운트 증가
				}
			}
			
			double result =(double) cnt/num*100;  //평균을 넘는 비율을 구하기
			System.out.printf("%.3f", result);  //소수점 셋째 자리 출력 (%.3f)사용
			System.out.println("%");
		}
		in.close();
	}			
}

 

 

여기까지 1차원 배열에 대한 백준 알고리즘 4단계 풀이였습니다!! 처음보다 점점 어려워 짐을 느끼고 있는데요! 그래도 포기하지 않고 열심히 해보겠습니다! 제 풀이보다 더 좋은 풀이가 있거나 이해가 안가는 부분 있으시면 댓글로 남겨주세요! 감사합니다 ㅎㅎ🥰