본문 바로가기

코딩테스트

[JAVA] 1차원 배열

10807 개수 세기

자바에서는 배열 선언과 생성 두 단계가 필요하다.

선언 : int intArrary[] 또는 int[] intArray

생성(배열 공간 할당) : intArray = new int[5] 

또는 int intArray[] = new int[5]와 같이 선언과 동시에 배열 생성이 가능하다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;

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

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
    int i=Integer.parseInt(br.readLine());
    int[] arr = new int[i];
    int count=0;


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

    for(int n = 0; n < i; n++){
        arr[n] = Integer.parseInt(st.nextToken());
    }

    int b = Integer.parseInt(br.readLine());

    for(int j = 0; j < arr.length; j++){
        if(b == arr[j]) {
            count++;
        }
    }

    System.out.println(count);
    
  }

}

위와 같이 배열 선언 및 생성을 동시에 해주고 반복문으로 초기화했다.

length() 메서드로 배열의 길이를 반환할 수 있다.

 


10871 X보다 작은 수

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;

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

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    
    String str[] =br.readLine().split(" ");
    int a = Integer.parseInt(str[0]);
    int b = Integer.parseInt(str[1]);
    int[] arr = new int[a];

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

    for(int n = 0; n < a; n++){
        arr[n] = Integer.parseInt(st.nextToken());
    }


    for(int j = 0; j < arr.length; j++){
        if(b > arr[j]) {
            bw.write(arr[j] + " ");
        }
    }
    bw.flush();

    bw.close();
    br.close();
    
  }

}

배열을 선언하지 않고 입력받자마자 따로 변수에 저장 후 바로 b와 비교하여 저장 후 출력하면 더 빨라진다.

 


10818 최소, 최대

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;

import java.util.Arrays;

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

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    //BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    
    int a = Integer.parseInt(br.readLine());
    int arr[] = new int[a];
    

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

    for(int n = 0; n < a; n++){
        arr[n] = Integer.parseInt(st.nextToken());
    }

    Arrays.sort(arr);
    System.out.println(arr[0] + " " + arr[a-1]);
    
    br.close();
    
  }

}

max, min 값을 설정하고 비교할 수도 있지만...

Arrays.sort()를 이용하면 오름차순으로 바로 정렬되므로 이를 이용한다.

index[-1]은 없다...

 


2562 최댓값

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;

import java.util.Arrays;

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

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    //BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    
    //int arr[] = new int[9];
    int a=0;
    int max=0;
    int idx=0;

    for(int n = 0; n < 9; n++){
      a = Integer.parseInt(br.readLine());
      if (a>max){
        idx=n+1;
        max=a;
      }
    }

    System.out.println(max);
    System.out.println(idx);
    
  }

}

배열을 이용하지 않고 풀어봤다.


10810 공 넣기

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;

import java.util.Arrays;

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

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    //BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    String str = br.readLine();
    StringTokenizer st = new StringTokenizer(str," ");
    int a = Integer.parseInt(st.nextToken());
    int b = Integer.parseInt(st.nextToken());
    
    int arr[] = new int[a];

    for(int n = 0; n < b; n++){
      String str2 = br.readLine();
      StringTokenizer st2 = new StringTokenizer(str2," ");
      int a2 = Integer.parseInt(st2.nextToken());
      int b2 = Integer.parseInt(st2.nextToken());
      int c2 = Integer.parseInt(st2.nextToken());

      for (int i=a2-1;i<b2;i++){
        arr[i]=c2;
      }
    }

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

}

공을 넣을 때 바구니는 인덱스와 다르므로 a2-1을 해주어야 한다.

 


5597 과제 안 내신 분..?

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;

import java.util.Arrays;

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

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    //BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    
    int arr[] = new int[30];

    for(int n = 0; n < 28; n++){
      int a = Integer.parseInt(br.readLine());
      arr[a-1]=1;
      
    }

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

}

JAVA는 따로 초기화 안하면 0으로 초기화된다.

 


3052 나머지

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;


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);
    }
}

boolean 배열을 선언한 후, 나머지 연산을 이용해 해당하는 나머지가 있으면 True로 저장한다.

(boolean 배열의 default 값은 false)

그 후 true인 값을 만나면 count++로 나머지가 다른 수의 개수를 샐 수 있다.

 

import java.util.HashSet;
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));
		HashSet<Integer> h = new HashSet<Integer>();
 
		
		for (int i = 0; i < 10; i++) {
			h.add(Integer.parseInt(br.readLine()) % 42);
		}
		
		System.out.print(h.size());
	}
}

JAVA의 HashSet을 이용할 수 있다!

HashSet은 Set(집합)과 비슷하다. 순서가 따로 없고 중복 저장이 안된다.

HashSet<Integer> h = new HashSet<Integer>(); 와 같이 HashSet을 생성하고 선언할 수 있다. 

add() 메서드로 HashSet에 값을 넣는데, 중복되는 값이 없으면 저장되며 True를 반환하고, 있으면 저장되지 않고 False를 반환한다.

 


10811 바구니 뒤집기

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;


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

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

      StringTokenizer st = new StringTokenizer(br.readLine(), " ");
      int n = Integer.parseInt(st.nextToken());
      int m = Integer.parseInt(st.nextToken());

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

      for (int i=0; i<m; i++){
        st = new StringTokenizer(br.readLine(), " ");
        int a = Integer.parseInt(st.nextToken())-1;
        int b = Integer.parseInt(st.nextToken())-1;

        while(a<b){
          int temp=arr[a];
          arr[a++]=arr[b];
          arr[b--]=temp;
        }
      }

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

주어진 두 a,b를 바꾸는 것이 아닌 그 범위 내의 모든 수를 역순으로 바꾸는 것이다.

 


1546 평균

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;

import java.util.Arrays;


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

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

      int a = Integer.parseInt(br.readLine());
      double arr[] = new double[a];
      
      StringTokenizer st = new StringTokenizer(br.readLine(), " ");
      for (int i=0; i<a; i++){
        arr[i] = Double.parseDouble(st.nextToken());
      }
      
      Arrays.sort(arr);
      
      for (int i=0; i<a; i++){
        arr[i] = (arr[i]/arr[a-1])*100;
      }

      double average = Arrays.stream(arr).average().orElse(0);
      
      System.out.println(average);
          
    }
}

괄호를 잘 해주지 않으면 계산이 제대로 되지 않는다...

또 Arrays.stream에서 평균을 구하는 메서드를 이용해서 구해주었다. 특이한 점은 Arrays.stream(arr).average()를 그대로 print하면 틀리게 뜬다. 변수 종류도 같이 출력해서 그런듯...

orElse(0)은 average()가 리턴한 값이 없으면 null대신 0을 리턴한다.

 


# 회고

 

Stream을 이용하면 배열을 좀 더 쉽게 다룰 수 있다.

 

백준 카테고리를 따로 만들었다!

'코딩테스트' 카테고리의 다른 글

[JAVA] 심화 1  (0) 2024.01.17
[JAVA] 문자열  (0) 2024.01.16
[JAVA] 반복문  (1) 2024.01.13
[JAVA] 조건문  (0) 2024.01.12
[JAVA] 입출력과 사칙연산  (1) 2024.01.10