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 대비 시간복잡도와 메모리가 효율적임
위 = #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문의 변수깔끔하게 하기
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;
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의 시간복잡도는 같다.
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 차이 확인
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값 구하기