언어 공부 내용 정리/백준

백준 자바 10807, 10871, 10818, 10813

wosrn 2023. 5. 23. 19:38

 

 

10807

import java.util.Scanner;

public class Main{
	
	public static void main(String args[]) {
	
	int sum=0;
    Scanner input = new Scanner(System.in);
    byte n = input.nextByte(); //5
    int [] array = new int [n]; //5개 배열 생성, 인덱스는 0-4
    for(int i=0;i<n;i++) {
    array[i] = input.nextInt(); //인덱스 0-4까지 수 대입

    }
    int v=input.nextInt();
    int res = 0;
    for(int i=0;i<n;i++) {
    	if(array[i]==v) res += 1;
    }
 
    System.out.println(res);
	}
}

10871

import java.util.Scanner;

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

    Scanner input = new Scanner(System.in);
    int n = input.nextInt(); //5
    int x=input.nextInt(); //비교할 정수 x 
    int [] array = new int [n]; //5개 배열 생성, 인덱스는 0-4
    for(int i=0;i<n;i++) {
    array[i] = input.nextInt(); //인덱스 0-4까지 수 대입
    if(array[i]<x) System.out.print(array[i]+ " ");
    }
    
	}
}

 

  • 배열과 반복문의 시너지를 잘 느낄 수 있던  문제
  • 10807을 풀때는 for문을 두번 썼는데, 10871을 풀다보니 문득 그럴필요가 없다는걸 깨닫게 되었다.. 단계적으로 이 코드 작성 후 다음 실행할 코드 작성 후 이런식으로 생각하다보니 for문을 두개 쓰게 되었던 것 같다 단순히 문제를 맞추는 것도 중요하지만 좋은 코드를 짜는것도 중요하니까 ! 앞으론 문제를 풀면서 더 효율적인 방법이 없는지 계속 고민을 해봐야겠다

10818

import java.util.Scanner;

public class Main{
	
	public static void main(String args[]) {
	
   
    Scanner input = new Scanner(System.in);
    int n = input.nextInt();
    int [] array = new int [n]; 
    for(int i=0;i<n;i++) {
    array[i] = input.nextInt(); 
    
    }
    int min = array[0];
    for(int i=1;i<n;i++) {
        if(array[i]<min) min=array[i];
        }
    System.out.print(min);
    
    int max = array[0];
    for(int i=1;i<n;i++) {
        if(array[i]>max) max=array[i];
        }
    System.out.print(" " + max);
	}
	
}
   
//min을 array[0]으로 설정 - array[1]과 비교해서 작으면 바꾸고 아니면 냅둠
  • 문제 보고 순간 어떻게 풀지? 하고 고민하다가 처음에는 max에 뭔가를 대입하지 않은 상태로 array[i]와 array[ii+1]을 비교해서 더 작은걸 min에 넣고 다음 비교를 진행하는 식으로 하려고 했는데 그 뒤로 어떻게 해야할지 잘 떠오르지 않았다
  • 그래서 고민을 더 하다가 'min을 array[0]으로 설정 - array[1]과 비교해서 작으면 바꾸고 아니면 냅두자' 가 떠올라서 그렇게 했더니 성공 !

 

백준 솔브드 페이지에서 볼 수 있는 스트릭.. 뭔지 잘 몰랐는데 하루라도 안풀면 스트릭이 이어지지 않는거였다

최대한 매일 풀어서 많이 이어봐야겠다

 

10813

배열에서 값을 서로 바꿀 땐 그 과정에서 잠시 값을 보관할 제3의 변수를 만들어서 풀면 되는걸 수업시간에 배운게 생각나서, 처음에 코드를 이렇게 작성했더니 값이 답과 다르게 출력되었다. 컴파일에러는 아닌데 정답과 다를때는 경험상 예시를 하나들어 그 예시로 코드를 순서대로 따라가면서 어디가 틀렸는지를 찾는게 가장 나은 방법이었던 것 같아서 사진 속의 입력값대로 해보았다

 

그랬더니 25줄에 k-1번째 배열 칸에 i-1번째 배열의 값을 넣어야하는데 좌변 우변 위치가 바뀌었음을 알 수 있었다

그걸 알고 보니 24줄과 26줄이 동일한 코드였던,,; 쓰면서 간단히 설계하지 않고 머리로만 하다가 이런 실수가 난 것 같다

그 부분을 고치니 정답이 나왔다 ! 

근데 백준에서 내가 제출한 코드는 240ms 가 걸렸던데 다른 사람들거를 보니까 76ms부터 있었다 ㅠ ㅠ

어떻게 해야 시간을 줄일 수 있는지 모르겠다

그래서 서치를 좀 해봤는데 지금까지는 내가 쓴거랑 같은 코드만 보인다..맞은건 좋지만 시간줄이는 법이 궁금하다