ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 5단계 1차원 배열 - 3052 / 1546 / 89587 / 4344
    알고리즘/백준 2022. 1. 14. 01:54
    반응형

    백준 3052 :  나머지

     

    문제

    두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다.

    예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다.

    수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다.

    그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.

    입력

    첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다.

    이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다.

    출력

    첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다.

    정답

     이중 for문을 이용하여 같은 숫자가 있을 경우 count값을 -1 해주었다.

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class Main{
    	public static void main(String[] args) throws NumberFormatException, IOException{
    		
    		int[] arr = new int[10];
    		
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		
    		for(int i=0; i<arr.length; i++ ) {
    			arr[i] = Integer.parseInt(br.readLine()) % 42;
    		}
    		
    		int count = 10;
    		for (int i = 0; i < arr.length; i++) {
    			for (int j = i+1; j < arr.length; j++) {
    				if(arr[i] == arr[j]) {
    					count--;
    					break;
    				}
    			}		
    		}
    		System.out.println(count);
    
    	}
    }

     

     

     위 문제는 배열을 이중 for문을 이용하여 풀었지만 Set 컬렉션을 이용하면 더 간단하게 풀 수 있다.

    Set은 기본적으로 중복이 허용이 안되기때문에 중복된 값이 있으면 추가가 안되는 점을 이용한다.

     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.HashSet;
    import java.util.Set;
    
    
    public class Main{
    	public static void main(String[] args) throws NumberFormatException, IOException{
    		
    		int[] arr = new int[10];
    		boolean[] arr_count = new boolean[10];
    		
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		Set<Integer> set = new HashSet<Integer>();
    		
    		for(int i=0; i<arr.length; i++ ) {
    			arr[i] = Integer.parseInt(br.readLine()) % 42;
    		}
    		
    		for (int i = 0; i < arr.length; i++) {
    			set.add(arr[i]);
    		}
    		
    		System.out.println(set.size());
    		
    	}
    	
    }

     

    결과화면

    1. HashSet 사용
    2. 배열 사용
    3. 배열 사용

     

    백준 1546 :  평균

     

    문제

    세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다.

    일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다.

    그리고 나서 모든 점수를 점수/M*100으로 고쳤다.

    예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.

    세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.

    입력

    첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다.

    둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고,

    적어도 하나의 값은 0보다 크다.

    출력

    첫째 줄에 새로운 평균을 출력한다.

    실제 정답과 출력값의 절대오차 또는 상대오차가 10-2 이하이면 정답이다.

    정답
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    
    public class Main{
    	public static void main(String[] args) throws NumberFormatException, IOException{
    		
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		int[] arr = new int[Integer.parseInt(br.readLine())];
    		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
    		
    		int max = 0;
    		int sum = 0;
    		for (int i = 0; i < arr.length; i++) {
    			arr[i] = Integer.parseInt(st.nextToken());
    			sum += arr[i];
    			if(arr[i] > max)
    				max = arr[i];
    		}
    		
    		System.out.println(((double)sum / max) * 100 / arr.length);
    
    	}
    	
    }

     

     사실 배열을 이용하지 않고 for문에서 입력받으면 sum 변수에 더해주고 max 값 찾아주는 로직을 구현하면 간단하다.

    이 코드는 너무 쉬운 코드이니 구현안하겠다.

     

    결과화면

     

     

     

    백준 1546 :  평균

     

    문제

    세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다.

    일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다.

    그리고 나서 모든 점수를 점수/M*100으로 고쳤다.

    예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.

    세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.

    입력

    첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다.

    둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고,

    적어도 하나의 값은 0보다 크다.

    출력

    첫째 줄에 새로운 평균을 출력한다.

    실제 정답과 출력값의 절대오차 또는 상대오차가 10-2 이하이면 정답이다.

    정답
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    
    public class Main{
    	public static void main(String[] args) throws NumberFormatException, IOException{
    		
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		int[] arr = new int[Integer.parseInt(br.readLine())];
    		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
    		
    		int max = 0;
    		int sum = 0;
    		for (int i = 0; i < arr.length; i++) {
    			arr[i] = Integer.parseInt(st.nextToken());
    			sum += arr[i];
    			if(arr[i] > max)
    				max = arr[i];
    		}
    		
    		System.out.println(((double)sum / max) * 100 / arr.length);
    
    	}
    	
    }

     

     사실 배열을 이용하지 않고 for문에서 입력받으면 sum 변수에 더해주고 max 값 찾아주는 로직을 구현하면 간단하다.

    이 코드는 너무 쉬운 코드이니 구현안하겠다.

     

    결과화면

     

     

    백준 8958 :  OX퀴즈

     

    문제

    "OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다.

    문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다.

    예를 들어, 10번 문제의 점수는 3이 된다.

    "OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.

    OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.

    입력

    첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고,

    길이가 0보다 크고 80보다 작은 문자열이 주어진다. 문자열은 O와 X만으로 이루어져 있다.

    출력

    각 테스트 케이스마다 점수를 출력한다.

    정답

     3가지 방식으로 했다. 

    1. System.out.println를 이용

    2. BufferedWriter를 이용

    3. StirngBuilder를 이용

    아래 코드는 StringBuilder를 이용한 코드이다.

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    
    public class Main{
    	public static void main(String[] args) throws NumberFormatException, IOException{
    		
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		StringBuilder sb = new StringBuilder();
    		String[] arr = new String[Integer.parseInt(br.readLine())];
    		
    		for (int i = 0; i < arr.length; i++) {
    			arr[i] = br.readLine();
    		}
    		int sum;
    		int count;
    		for (int i = 0; i < arr.length; i++) {
    			count = 0;
    			sum = 0;
    			for (int j = 0; j < arr[i].length(); j++) {
    				if(arr[i].charAt(j) == 'O')
    					count++;
    				else if(arr[i].charAt(j) == 'X')
    					count = 0;
    				sum += count;
    			}
    			sb.append(sum).append('\n');
    		}
    		System.out.println(sb);
    	}
    	
    }

     

    배열을 이용하지 않는 방법

    byte단위로 입력받은 문자열을 꺼내와 코드를 구현

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.IOException;
     
    public class Main {
    	public static void main(String[] args) throws IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
     
    		StringBuilder sb = new StringBuilder();
     
    		int test_case = Integer.parseInt(br.readLine()); // 테스트 케이스
     
    		for (int i = 0; i < test_case; i++) {
     
    			int cnt = 0; // 연속횟수
    			int sum = 0; // 누적 합산
     
    			for (byte value : br.readLine().getBytes()) {
    				
    				if (value == 'O') {
    					cnt++;
    					sum += cnt;
    				} 
    				else {
    					cnt = 0;
    				}
    			}
    			
    			sb.append(sum).append('\n');
     
    		}
    		System.out.println(sb);
     
    	}
    }

     

    결과화면

    1. StirngBuilder를 이용

    2. BufferedWriter를 이용

    3. System.out.println를 이용

     

    결과적으로는 StringBuilder가 제일 빨랐다.

     

     

    백준 4344 :  평균은 넘겠지

     

    문제

    대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다.

    당신은 그들에게 슬픈 진실을 알려줘야 한다.

    입력

    첫째 줄에는 테스트 케이스의 개수 C가 주어진다.

    둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고,

    이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.

    출력

    각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.

    정답
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    public class Main {
    
    	public static void main(String[] args) throws NumberFormatException, IOException {
    		// TODO Auto-generated method stub
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		
    		StringTokenizer st;
    		
    		int C = Integer.parseInt(br.readLine());
    		
    		int[] arr;
    		double[] rate = new double[C];
    
    		for (int i = 0; i < C; i++) {
    			double sum = 0;
    			double avg = 0;
    			
    			int count = 0;
    			st = new StringTokenizer(br.readLine(), " ");
    			int N = Integer.parseInt(st.nextToken());
    			arr = new int[N];
    
    			
    			for (int j = 0; j < arr.length; j++) {
    				arr[j] = Integer.parseInt(st.nextToken());
    				sum += arr[j];
    			}
    			avg = sum / N;
    			
    			for (int j = 0; j < arr.length; j++) {
    				if(arr[j] > avg) {
    					count++;
    				}
    			}
    
    			rate[i] = ((double)count/N)*100;
    		}
    		
    		for (int i = 0; i < rate.length; i++) {
    			System.out.printf("%.3f%%\n", rate[i]);
    			
    		}
    
    	}
    
    }

     문제 카테고리가 1차원 배열이므로 1차원 배열로 풀었다

    가변길이 2차 배열로도 풀수있을것 같다.

     

     

    결과화면

     

    반응형

    댓글

Designed by Tistory.