백준 - 4단계 1차원 배열

이상훈·2023년 3월 7일
0

10807번

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int Count = Integer.parseInt(bf.readLine());
        int cnt = 0;
        int[] array = new int[Count];
        StringTokenizer st = new StringTokenizer(bf.readLine());
        for (int i = 0; i<Count; i++) {
            array[i] = Integer.parseInt(st.nextToken());
        }
        int Num = Integer.parseInt(bf.readLine());
        for (int i = 0; i<array.length; i++) {
            if (array[i] == Num) {
                cnt++;
            }
        }
        System.out.println(cnt);
    }
}
배열 생성 int[] arr = new int[Count];
arr[i] 반복문으로 배열 요소에 접근가능
arr.length 적극사용

10871번
#1 배열 사용하는방법

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(bf.readLine());
		int cnt = Integer.parseInt(st.nextToken());
		int num = Integer.parseInt(st.nextToken());

		int[] arr = new int[cnt];
		st = new StringTokenizer(bf.readLine());
		for (int i=0; i<cnt; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}
		for (int i = 0; i<cnt; i++) {
			if (arr[i] < num) {
				System.out.print(arr[i]+ " ");
			}
		}
    }
}
System.out.print(arr[i]+ " "); 조건식으로 걸러서 한줄로 출력한다는 생각

#2 배열을 사용하지 않고 실행

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

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(bf.readLine());
		int cnt = Integer.parseInt(st.nextToken());
		int num = Integer.parseInt(st.nextToken());

		StringBuilder sb = new StringBuilder();

		st = new StringTokenizer(bf.readLine());

		for (int i=0; i<cnt; i++) {
			int value = Integer.parseInt(st.nextToken());

			if (value < num) {
				sb.append(value).append(' ');
			}
		}
		System.out.println(sb);
	}
}
StringBuilder 사용해서 문자열 합치기
sb.append(value) - append가 합치는 메서드
System.out.println(sb); 출력 가능
#1 대비 시간복잡도와 메모리가 효율적임

StringBuilder란?

위 = #2 아래 = #1

10818번
#1 조건문 활용

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int Num = Integer.parseInt(bf.readLine());
        
        int[] arr = new int[Num];
        StringTokenizer st = new StringTokenizer(bf.readLine());
        for (int i = 0; i<Num; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        
        int max = arr[0];
        int min = arr[0];
        for (int i = 0; i<Num; i++) {
            if (max < arr[i]) {
                max = arr[i];
            }
            if (min > arr[i]) {
                min = arr[i];
            }
        }
        System.out.println(min+ " "+ max);
        
    }
}
int max = arr[0]; 변수 선언하고
반복문, 조건문으로 배열내부 요소들을 전부 비교해서 조건에 부합할때마다 max값을 덮어씌어준다.

#2 sort활용

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int Num = Integer.parseInt(bf.readLine());
        
        int[] arr = new int[Num];
        StringTokenizer st = new StringTokenizer(bf.readLine());
        for (int i = 0; i<Num; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        
        Arrays.sort(arr);
        System.out.println(arr[0]+" "+arr[arr.length-1]);
        
    }
}

성능비교했을때 #1 방법이 더 효율적이다.
(아래 = #1, 위 = #2)

2562번
#1

import java.util.*;

public class Main {
	public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
		int[] arr = new int[9];
		for (int i = 0; i<9; i++) {
			arr[i] = sc.nextInt();
		}

		int max = arr[0];
		int maxIndex = 0;
		for (int i = 0; i<9; i++) {
			if (max < arr[i]) {
				max = arr[i];
                maxIndex = i;
			}
		}
		System.out.println(max);
        System.out.println(maxIndex+1);

	}
}

#2 향상된 for문 사용

import java.util.*;

public class Main {
	public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
		int[] arr = new int[9];
		for (int i = 0; i<9; i++) {
			arr[i] = sc.nextInt();
		}

		int count = 0;
		int max = 0;
		int index = 0;
        
		for (int value : arr) {
            count++;
			if (value > max) {
				max = value;
                index = count;
			}
		}
		System.out.println(max);
        System.out.println(index);

	}
}
향상된 for문을 사용하는 이유 : 배열의 요소 출력
속도는 일반 for문과 같음

10810번
#1

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

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(bf.readLine());
		int bucket = Integer.parseInt(st.nextToken());
		int count = Integer.parseInt(st.nextToken());
		int[] arr = new int[bucket];

		for (int i = 0; i<count; i++) {
			st = new StringTokenizer(bf.readLine());
			int firstBucket = Integer.parseInt(st.nextToken());
			int lastBucket = Integer.parseInt(st.nextToken());
			int ballNum = Integer.parseInt(st.nextToken());

			for (; firstBucket<=lastBucket; firstBucket++) {
				arr[firstBucket-1] = ballNum;
			}
		}

		for (int arrs : arr) {
			System.out.print(arrs+ " ");
		}
	}
}

#2

import java.util.*;
public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
		int[] arr = new int[num];
		int line = sc.nextInt();
		for(int i=0;i<line;i++)
		{
			int st = sc.nextInt();
			int end = sc.nextInt();
			int ballnum = sc.nextInt();
			for(int j = st-1;j<end;j++)
			{
				arr[j] = ballnum;
			}
		}
		for(int i=0;i<arr.length;i++)
		{
			System.out.print(arr[i] + " ");
		}
		
	}
}
	
변수명을 #2처럼 간결하고 의미는 전달되게 설정하자
향상된 for문을 사용하지 않아도 배열의 요소들을 출력할 수 있어
for문의 변수깔끔하게 하기

10813번

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

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(bf.readLine());
		int bucket = Integer.parseInt(st.nextToken());
		int count = Integer.parseInt(st.nextToken());

		int[] arr = new int[bucket];
		for (int i = 0; i<bucket; i++) {
			arr[i] = i+1;
		}

		for (int i = 0; i<count; i++) {
			st = new StringTokenizer(bf.readLine());
			int A = Integer.parseInt(st.nextToken());
			int B = Integer.parseInt(st.nextToken());
			int tmp = arr[A-1];
			arr[A-1] = arr[B-1];
			arr[B-1] = tmp;
		}

		for (int i = 0; i<arr.length; i++) {
			System.out.print(arr[i] + " ");
		}

	}
}
배열 요소끼리 자리 바꾸기 할때
tmp = A;
A = B;
B = tmp;

5597번

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

public class Main {
	public static void main(String[] args) throws IOException {
		Scanner sc = new Scanner(System.in);
		boolean[] student = new boolean[31];
        // 0번째 배열은 사용하지 않음

		for(int i=0; i<28; i++) {
			int success = sc.nextInt();
			student[success] = true;
            // 인덱스에 입력을 받는다는 생각
            // 제출하면 true
		}
		for(int i=1; i<student.length; i++) {
			if(!student[i]) // 인덱스 1부터 false면 출력하기
				System.out.println(i);
		}
		
		sc.close();

	}
}

3052번
#1

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

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		HashSet<Integer> h = new HashSet<Integer>();

		for (int i = 0; i < 10; i++) {
			h.add(Integer.parseInt(bf.readLine()) % 42);
			//입력받은 값의 나머지 값을 add메소드를 통해 HashSet에 저장
		}

		System.out.print(h.size());
	}
}
그냥 배열말고 중복이 없는 Hash Set을 사용하면 쉽게 풀 수 있다.

#2

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
 
public class Main {
    public static void main(String[] args) throws IOException {
 
        boolean[] arr = new boolean[42];
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        for(int i = 0 ; i < 10 ; i++) {
            arr[Integer.parseInt(br.readLine()) % 42] = true;
        }
        
        int count = 0;
        for(boolean value : arr) {
            if(value){    // value 가 true 라면
                count++;
            }
        }
        System.out.println(count);
    }
}
42의 나머지는 42개이니까 boolean 배열을 생성
배열의 인덱스를 입력받은 수를 42로 나눴을때 나머지로 해서 true로 해준다.
향상된 for문을 사용해서 true인것만 카운트해준다.

#1과 #2의 시간복잡도는 같다.

10811번

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

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(bf.readLine());
		int bucket = Integer.parseInt(st.nextToken());
		int changing = Integer.parseInt(st.nextToken());

		int[] arr = new int [bucket];
		for (int i=0; i<bucket; i++) {
			arr[i] = i+1;
		}

		for (int i = 0; i<changing; i++) {
			st = new StringTokenizer(bf.readLine());
			int first = Integer.parseInt(st.nextToken())-1;
			int last = Integer.parseInt(st.nextToken())-1;

			while (first < last) {
				int temp = arr[first];
				arr[first++] = arr[last];
				arr[last--] = temp;
			}
		}

		for (int num : arr) {
			System.out.print(num+ " ");
		}
	}
}
while (first < last) {
	int temp = arr[first];
	arr[first++] = arr[last];
	arr[last--] = temp;
}
배열 i부터 j까지 역순으로 정렬시키기
이런 사고를 할 수 있을까?
first++ 과 ++first 차이 확인

1546번

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

public class Main {
	public static void main(String[] args) throws IOException{
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		int subjectNum = Integer.parseInt(bf.readLine());
		StringTokenizer st = new StringTokenizer(bf.readLine());

		int[] arr = new int[subjectNum];
		int Sum = 0;
		int Max = 0;
		for (int i =0; i< arr.length; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
			Sum += arr[i];
			if (Max < arr[i]) {
				Max = arr[i];
			}
		}

		double r=0;
		for (double num : arr) {
			r += num/Max*100;
		}
		double A = r/arr.length;
		System.out.println(A);
	}
}
max값 구하기

0개의 댓글