sm 기술 블로그

[단계별] 백준 (답) java (1~87) 본문

문제/백준_자바

[단계별] 백준 (답) java (1~87)

sm_hope 2022. 4. 18. 11:03

1. 1000

import java.util.*;

public class Main{
	public static void main(String args[]){
		Scanner sc = new Scanner(System.in);
		int a, b;
		a = sc.nextInt();
		b = sc.nextInt();
		System.out.println(a + b);
	}
}


2. 1001

import java.util.*;

class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        System.out.println(sc.nextInt()-sc.nextInt());
    }

3. 10171

import java.util.*;

public class Main{
    public static void main(String args[]){       
        System.out.println("\\    /\\");
        System.out.println(" )  ( ')");
        System.out.println("(  /  )");
        System.out.println(" \\(__)|");
    }
}

자바는 역슬래시를 하나만 써주면 인식을 못한다.(바보다) 역슬래시는 \ (원화)

4. 10718

import java.util.*;

class Main{
    public static void main(String[] agrs){
        System.out.println("강한친구 대한육군");
        System.out.println("강한친구 대한육군");
    }
}

 

5. 1330

내가 푼거

import java.util.*;

class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int A = sc.nextInt();
        int B = sc.nextInt();
        
        if(-10000<=A && B<=10000){
            if(A>B){
                System.out.println(">");
            }
            else if(A<B){
                System.out.println("<");
            }
            else {
                System.out.println("==");
            }
        }
        
    }
}

실력자들의 답

import java.util.*;

interface Main{
	static void main(String[]z){
		
		Scanner s=new Scanner(System.in);
		
		int a=s.nextInt()-s.nextInt();
		
		System.out.print(a>0?">":a<0?"<":"==");
		
		}
	}
import java.util.*;

class Main{
	public static void main(String[]z){
		
		Scanner s=new Scanner(System.in);
		
		int a=s.nextInt()-s.nextInt();
		
		System.out.print(a>0?">":a<0?"<":"==");
		
		}
	}

 

6. 1008

import java.util.*;

class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        
        double a= sc.nextDouble();
        double b= sc.nextDouble();        
        
        System.out.println(a/b);
    }
}

실력자들

interface Main{
	static void main(String[]a)
		throws Exception{
		byte[]b={0,0,0};
		
		System.in.read(b);
		
		System.out.print((b[0]-48)/(b[2]-48.));
		
		}
	}
    
    // 와.. 이건 난이도가 높네..
    // 48.에서 .이 있어야 나옴..

7. 10926

import java.util.*;

class Main{
	public static void main(String[]a) {
		Scanner sc = new Scanner(System.in);
		
		String name = sc.nextLine();
		
		System.out.println(name+"??!");
		
		}
	}
import java.util.*;
class Main {
    public static void main(String[] args) {
        System.out.println(new Scanner(System.in).nextLine()+"??!");
    }
}

8. 2525

import java.util.*;

class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int a = sc.nextInt();
		int b = sc.nextInt();
		int c = sc.nextInt();
		
		if ( ((a>=0)&&(a<=23)) && ((b>=0)&&(b<=59)) && ((c>=0)&&(c<=1000))) {
			
			int d = a * 60 + b +c;
			a = d / 60;
			b = d % 60;
			
			if(a >= 24) {
				a -= 24;
			}
			
			System.out.println(a+" "+b);
			
		}
	}
}

9. 10869

import java.util.*;

class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int a = sc.nextInt();
		int b = sc.nextInt();
				
		System.out.println(a+b);
		System.out.println(a-b);
		System.out.println(a*b);
		System.out.println(a/b);
		System.out.println(a%b);
			
		
	}
}
import java.util.*;

class Main{public static void main(String[]V){	
		Scanner S=new Scanner(System.in);
        
        int a=S.nextInt();
        int b=S.nextInt();
        
        System.out.print(a+b+"\n"+(a-b)+"\n"+a*b+"\n"+a/b+"\n"+a%b);
        }
}

10. 10172

import java.util.*;

class Main{
	public static void main(String[] s) {
		System.out.print("|\\_/|\n|q p|   /}\n( 0 )\"\"\"\\\n|\"^\"`    |\n||_/=\\\\__|");
	}
}

11. 2884

import java.util.*;

class Main{
	public static void main(String[] s) {
		Scanner sc=new Scanner(System.in);
		int H=sc.nextInt(),M=sc.nextInt();
		
		if((H>=0)&&(H<=23) && (M>=0)&&(M<=59)) {
			
			int a = (H*60)+M-45;
			
			if(a<0) {
				a=(24*60)+a;
			}
			
			H = a / 60;
			M = a % 60;
			
			System.out.println(H+" "+M);
			
		}		
		
	}
}

12. 2480

(객체버전)

import java.util.*;

class A{
	int a,b,c;
	
	public void setOprand(int a, int b, int c) {
		this.a = a;
		this.b = b;
		this.c = c;
	}
	
	public int compare1() {
		if((this.a==this.b)||(this.a==this.c)) {
			return this.a;
		}
		
		else
			return this.c;
		
	}
	
	public int compare2() {
		
		if(this.a > this.b) {
			if(this.a > this.c) {
				return this.a;
			}
			else {
				return this.c;
			}
		}
		
		else if(this.c > this.b) {
			if(this.c>this.a) {
				return this.c;
			}
			else {
				return this.a;
			}
		}
		else {
			return this.b;
		}
		
	}
}



class Main{
	public static void main(String[] args) {
		Scanner sc= new Scanner(System.in);
		
		int a = sc.nextInt() , b = sc.nextInt(), c = sc.nextInt();
		
		if((a==b)&&(b==c)) {
			System.out.println(10000+(a*1000));
		}
		else if ((a==b)||(b==c)||(a==c)) {
			A Com1= new A();
			Com1.setOprand(a, b, c);
			System.out.println(1000+(Com1.compare1())*100);
		}
		else {
			A Com2 = new A();
			Com2.setOprand(a, b, c);
			System.out.println(Com2.compare2()*100);
		}
	}
}

간단한 버전

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int A=sc.nextInt(),B=sc.nextInt(),C=sc.nextInt();
		int P;
		if (A==B){
			if(B==C) P=(A+10)*1000;
			else P=(A+10)*100;
		}
		else if (B==C || C==A) P=(C+10)*100;
		else P=Math.max(Math.max(A,B), C)*100;
		System.out.print(P);
	}
}

Math.max는 두수를 비교해서 가장 큰수를 return 한다.

 

13. 9498

import java.util.*;

class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		
		System.out.println((a>=90)?"A":((a>=80)?"B":(a>=70)?"C":(a>=60)?"D":"F"));
		
	}
}

14. 18108

import java.util.*;

interface Main{
	static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.println(sc.nextInt()-543);
		
	}
}

15. 2753

import java.util.*;

interface Main{
	static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		
		if((a%4==0)&&((a%100!=0)||(a%400==0))){
			System.out.println("1");
		}
		else {
			System.out.println("0");
		}
	}
}

16. 2588

import java.util.Scanner;
 
public class Main {
 
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
 
		int A = in.nextInt();
		String B = in.next();
        
		in.close();
 
		System.out.println(A * (B.charAt(2) - '0'));
		System.out.println(A * (B.charAt(1) - '0'));
		System.out.println(A * (B.charAt(0) - '0'));
		System.out.println(A * Integer.parseInt(B));
 
	}
}

 

 

문자열의 배열로 아스키코드값을 나타낸다. 따라서 0 (32)의 값을 빼줘야 값이 문제없이 나올 수 있다.

ex) B.charAt(2) = 5 여기서 5는 아스키코드값이고 실제 값은 53이고 48인 0의 값을 빼주면 문제 없음

 

17. 14681

import java.util.*;

interface Main{
	static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a=sc.nextInt();
		int b=sc.nextInt();
		
		if(a>0&&b>0) {
			System.out.println(1);
		}
		else if(a<0&&b>0) {
			System.out.println(2);
		}
		else if(a<0&&b<0) {
			System.out.println(3);
		}
		else{
			System.out.println(4);
		}
		

		}	
	}

18. 2739

import java.util.*;

interface Main{
	static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a=sc.nextInt();
		
		for(int i=1;i<10;i++) {
			System.out.println(a + " * " + i + " = " + a*i);
		}

		}	
	}

19. 10950

import java.util.*;


public class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int num = sc.nextInt();
		int a[]=new int[num];
		
		for(int i=0;num-i>0;i++) {
			a[i] = sc.nextInt()+sc.nextInt();
		}
		
		for(int i=0;num-i>0;i++) {
			System.out.println(a[i]);
		}
		
	}
}

배열을 사용하려면 인스턴스화 한 후 사용할 수 있다는것을 기억해 두자.

 

20. 15552

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


public class Main{
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int N = Integer.parseInt(br.readLine());
		
		StringTokenizer st;
		
		for(int i=0;i<N;i++) {
			st = new StringTokenizer(br.readLine()," ");
			bw.write(Integer.parseInt(st.nextToken())+Integer.parseInt(st.nextToken())+"\n");
		}
		
		bw.flush();
		
	}
}

st = new StringTokenizer(br.readLine()," ");  받은 값들은 공백없이 받기 때문에 공백을 통해 구분해준다.

bw.flush(); 를 통해서 출력해준다.

 

21. 2741

import java.util.*;

class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int a = sc.nextInt();
		
		for(int i=1; i<=a; i++) {
			System.out.println(i);
		}
	}
}

22. 2742

import java.util.*;

class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int a = sc.nextInt();
		
		for(int i=a; i>0; i--) {
			System.out.println(i);
		}
	}
}

23. 11021

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

class Main{
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int N = Integer.parseInt(br.readLine());
		
		StringTokenizer st;
		
		for(int i=0; i<N; i++) {
			st = new StringTokenizer(br.readLine()," ");
			bw.write("Case #"+(i+1)+": "+(Integer.parseInt(st.nextToken())+Integer.parseInt(st.nextToken()))+"\n");
			
		}
		
		bw.flush();
				
		
		
	}
}

24. 11022

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

class Main{
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int N = Integer.parseInt(br.readLine());
		
		StringTokenizer st;
		
		for(int i=0; i<N; i++) {
			st = new StringTokenizer(br.readLine()," ");
			int A = Integer.parseInt(st.nextToken());
			int B = Integer.parseInt(st.nextToken());
			
			bw.write("Case #"+(i+1)+": "+ A+" + "+B+" = "+(A+B)+"\n");
			
		}
		
		bw.flush();
				
		
		
	}
}

25. 2438

import java.util.*;

class Main{
	public static void main(String[] args)  {
		Scanner sc = new Scanner(System.in); 
			
		int num = sc.nextInt();
		
		for(int i=0;i<num;i++) {
			for(int j=0;j<=i;j++) {
			System.out.print("*");
			
		}
			System.out.print("\n");
		}
				
		
		
	}
}

26. 2439

import java.util.*;

class Main{
	public static void main(String[] args)  {
		Scanner sc = new Scanner(System.in); 
			
		int num = sc.nextInt();
		
		for(int i=1;i<=num;i++) {
			for(int j=0;j<num-i;j++) {
			System.out.print(" ");			
		}
			for(int k=0;k<i;k++) {
				System.out.print("*");			
		}
			System.out.print("\n");
		}
				
		
		
	}
}

27. 10871

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

class Main{
	public static void main(String[] args) throws Exception  {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
				
		StringTokenizer st= new StringTokenizer(br.readLine()," ");
		// 입력받은 값에 공백을 추가하여 저장.		
		
		int A = Integer.parseInt(st.nextToken());
		int B = Integer.parseInt(st.nextToken());
		
		StringBuilder sb = new StringBuilder();
		//배열을 저장하기 위해서 선언
		
		// 1열 입력
		
		st = new StringTokenizer(br.readLine()," ");
		// 입력받은 값에 공백을 추가하여 저장.	
		
		for(int i=0;i<A;i++) {
			int value = Integer.parseInt(st.nextToken());
				// 입력 값을 value에 저장함
			
			if(value < B) {
				sb.append(value).append(' ');
				// 값과 공백을 집어넣는다. ""가 아닌 ''를 쓴다는 것을 주의하자.
			}
		}
		// 2열 입력
		
		System.out.println(sb);
				
	}
}

28. 10951

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


public class Main {

    public static void main(String[] args) throws Exception {
            BufferedReader br =new BufferedReader(new InputStreamReader(System.in));

            StringTokenizer st;
            StringBuilder sb = new StringBuilder();
            String str;

            while((str=br.readLine())!=null){

                st = new StringTokenizer(str," ");

                int A=Integer.parseInt(st.nextToken());
                int B=Integer.parseInt(st.nextToken());

                sb.append((A+B)).append("\n");

            }

        System.out.print(sb);

    }
}

29. 10952

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


public class Main {

    public static void main(String[] args) throws Exception {

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

        StringTokenizer st;
        StringBuilder sb = new StringBuilder();

        while(true) {

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

            if(A==0 && B==0) {
                break;
            }
            sb.append((A+B)).append('\n');
        }
        System.out.println(sb);
    }
}

30. 1110

import java.util.*;

class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int a = sc.nextInt();
		int b=a,c=0,d=0,e=0,i=0;
		
		while(true) {
			c=b%10; //1의자리
			d=(b-c)/10;  //10의자리
			e=c+d;  
			
			if(e<10) {
			b=(10*c)+e;
			}
			
			else {
			b=(10*c)+(e%10);	
			}
			
			i++;
			
			if(b==a) {
				break;
			}
			
			
		}
		
		System.out.println(i);
	}
}

31. 10818

import java.util.*;

class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		
		int ary[] = new int[N];
		
		for(int i=0; i<N;i++) {
			ary[i] = sc.nextInt();
		}
		
		Arrays.sort(ary);
		System.out.println(ary[0] + " " + ary[N-1]);
	}
}

32. 2562

import java.util.*;

class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int arr[] = new int[9];
		int arr2[] = new int[9];
		int N=0;
		
		for(int i=0; i<9;i++) {
		arr[i]=sc.nextInt();
		arr2[i] = arr[i];
	}
		Arrays.sort(arr2);
		
		for(int i=0; i<9;i++) {
			if(arr2[8]==arr[i]) {
				N=i;
			}
		}
		
		System.out.println(arr[N]+"\n"+(N+1));
	}	
}

33. 2577

import java.util.*;

public class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int value = (sc.nextInt()*sc.nextInt()*sc.nextInt());
		String str = Integer.toString(value);
		
		
		for(int i=0; i<10; i++) {
			int count =0;
			for(int j=0; j<str.length();j++) {
				if((str.charAt(j)-'0')==i) {
					count++;
				}
			}
			System.out.println(count);
		}
	}	
}

___.charAt() 은 문자열을 문자로 바꿔준다.

 

34. 3052

import java.util.*;

public class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		HashSet<Integer> H =new HashSet<Integer>();
		
		for(int i=0;i<10;i++) {
			H.add(sc.nextInt()%42);
		}
	
		System.out.println(H.size());
	}	
}

HashSet은 

https://smhope.tistory.com/13

 

객체지향) 컬렉션 프레임워크

Collections Framework Collections Framework 구성도 Set과 List 차이점 List는 중복을 허용하고 set은 중복을 허용하지 않는다. import java.util.ArrayList; import java.util.HashSet; import java.util.Iter..

smhope.tistory.com

확인

 

35. 1546

import java.util.*;

public class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int N = sc.nextInt();
		double arr[] = new double[N];
		double arr2[] = new double[N];
		double score=0;
		
		for(int i=0;i<N;i++) {
			arr[i]=(double)sc.nextInt();
		}
		
		Arrays.sort(arr);
		
		for(int i=0;i<N;i++) {
			arr2[i]=(arr[i]/arr[N-1])*100;
			score+=arr2[i];
		}
		score=score/N;
		
		System.out.println(score);
		
	}	
}

36. 8958

import java.util.*;

interface Main{static void main(String[]z){
	Scanner sc=new Scanner(System.in);
		
	String arr[] = new String[sc.nextInt()];
		
	for(int i=0;i<arr.length;i++) {
		arr[i] = sc.next();
	}
	
	for(int i=0; i<arr.length;i++) {
		int cnt=0;
		int sum=0;
		for(int j=0; j<arr[i].length(); j++) {
			if(arr[i].charAt(j)=='O') {
				cnt++;
			}
			else {
				cnt=0;
			}
			sum +=cnt;
		}
		System.out.println(sum);
	}
	
}
}

37. 4344

import java.util.*;

interface Main{static void main(String[]z){
	Scanner sc=new Scanner(System.in);
	
	int A=sc.nextInt();
	int arr[] = new int[A];
	double arr3[] = new double[A];
		
	for(int i=0;i<arr.length;i++) {
		int B=sc.nextInt();
		double arr2[] = new double[B];
		int cnt=0;
		double sum=0;
		
		for(int j=0;j<B;j++) {
		arr2[j]= (double)sc.nextInt();
		sum+=arr2[j];
		}
		
		arr3[i]=sum/B;
		
		for(int j=0;j<B;j++) {
		if(arr2[j]>arr3[i]) {
			cnt++;
		}
		}
		
		arr3[i]=cnt/((double)B);
	}
	
	for(int i=0;i<A;i++) {
		System.out.printf("%.3f%%\n",arr3[i]*100);
	}

}
}

※ println은 (~~~,~~~)가 정의되지 않음. 따라서 printf 로 써줘야함.

※ % 는 뒤에 것을 가져오자 라고 정의, %.3f% 로만 하면 두번째%는 ,뒤에 가져올 것이 없어 에러 발생

※ 따라서 %%로 하면 '%'가 출력 즉, 무엇을 붙이고 싶으면 % 뒤에 써줌 ex) %.3f%a -> 70a

 

38. 4673

import java.util.*;

class Main{
	public static void main(String[] args){	
		
		boolean[] check = new boolean[10001];
				
		for (int i = 1; i < 10001; i++){
			int n = d(i);
			
			if(n<10001) {
				check[n] = true;
			}
		}
										
		for(int i=1;i<10001;i++) {
			if(!check[i]) {
				System.out.println(i);
			}
		}
			
	}
	 
	public static int d(int num) {
		int sum=num;
		
		while(num!=0) {
			sum=sum+(num%10);
			num=num/10;
		}
		
		return sum;	
	 
	}
}

39. 1065

import java.util.*;

class Main{
	public static void main(String[] args){	
		
		Scanner sc = new Scanner(System.in);
		System.out.println(A(sc.nextInt()));
	 
	}
	
	public static int A(int num) {
		int cnt=0;
		
		if(num<100) {
			return num;
		}
		
		else {
			cnt=99;
			
			for(int i= 100;i<=num;i++) {
				int hun = i/100;
				int ten = (i/10)%10;
				int one = i%10;
				
				if((hun-ten)==(ten-one)) {
					cnt++;
				}
			}
		}
		return cnt;
	}
	
}

한수 => 등차수열인 수 (연속하는 두 수의 차이가 일정한 수열) ex) 321 -> 3-2=1 | 2-1=1 로 한수이다.

※ 1~99는 무조건 한수이다.(비교대상이 자신 혹은 하나밖에 없어서)

 

40. 11654

import java.util.*;

class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String A = sc.nextLine();
		
		
		System.out.println((int)A.charAt(0));
}
}

 41.11720

import java.util.*;

class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		String A = sc.next();
		int sum=0;
		
		for(int i=0;i<N;i++) {
			sum+=(A.charAt(i)-'0');
		}
		
		System.out.println(sum);
		
}
}

next()는 스페이스바를 쓰면 입력을 그만받고

nextLine()은 엔터를 쓰면 입력을 그만받는다.

 

ex)

Hello Wrold

next : Hello
nextLine : Hello Wrold

42. 10809

import java.util.Scanner;
 
public class Main {
 
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
 
		String N = sc.nextLine();
		
		int a[] = new int[26];
		
		for(int i=0;i<a.length;i++) {
			a[i]=-1;
		}
		
		for(int i=0;i<N.length();i++) {
			char ch = N.charAt(i);
			
			if(a[ch -'a']==-1) {
				a[ch-'a']=i;
			}
			
		}
		
		for(int val:a) {
			System.out.print(val+" ");
			
		}
		
		
	}
}

소문자 개수 : 26개

for(int val:a) : for-each문 ... a의 값을 하나씩 꺼내서 val에 집어넣어라. 

 

43. 2675

import java.util.Scanner;
 
public class Main {
 
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
 
		int N = sc.nextInt();
		
		
		for(int i=0;i<N;i++) {
			
			int b = sc.nextInt();
			String S= sc.next();
			
			
			for(int j=0;j<S.length();j++) {
				for(int k=0;k<b;k++) {
				System.out.print(S.charAt(j));	
				
				}
				
				
			}
			System.out.println();
		}
		
		
	}
}
2
3 ABC
AAABBBCCC
5
/HTP
/////HHHHHTTTTTPPPPP

이렇게 나와도 답임

 

44.  1157

import java.util.Scanner;
 
public class Main {
 
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		String S = sc.nextLine();
		
		int A[] = new int[26];
		
		for(int i=0; i<A.length;i++) {
			A[i]=0;
		}
		
		S=S.toUpperCase();
		
		for(int i=0; i<S.length();i++) {
			A[S.charAt(i)-'A']++;
		}
		
		int max=0;
		char ch='?';
		
		
		for(int i=0;i<26;i++) {
						
			
			if(A[i]>max) {
				max = A[i];
				ch = (char)(i+65);
			}
			
			else if(A[i]==max) {
				ch = '?';
				
			}
		}
		
		System.out.println(ch);
		
		
	}
}

답은 맞으나, 속도가 느리다.

 

45. 1152

import java.util.Scanner;
 
public class Main {
 
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
	
		String S= sc.nextLine();
		int cnt=1;
		
		for(int i=1;i<S.length();i++) {
			if(S.charAt(i)==' ') {
				cnt++;
			}
			
			
		}
		
				
		if(S.charAt(S.length()-1)==' ') {
			cnt--;
		}
		System.out.println(cnt);
	}
}

46. 2908

(나)

import java.util.Scanner;

class A{
	public int Values(String S,int a, int b) {
		
		if(S.charAt(a)>S.charAt(b)) {
			return 1;
		}
		
		else if(S.charAt(a)<S.charAt(b)) {
			return -1;
		}	
		
		else {
			return 0;
		}
		
	}
	
	public void Result(String S,int n) {
		if(n==1) {
			for(int i=2;i>=0;i--) {
				System.out.print(S.charAt(i));
			}						
		}
		
		else if (n==-1) {
			for(int i=6;i>=4;i--) {
				System.out.print(S.charAt(i));
			}						
		}

	}
}

public class Main {
 
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
	
		String S= sc.nextLine();
		
		A c1=new A();
		
		
		int num=c1.Values(S, 2, 6);
		
		if(num==0) {
			num=c1.Values(S, 1, 5);
			if(num==0) {
				num=c1.Values(S, 0, 4);
			}
		}
		
		c1.Result(S, num);		
		
	}
}

(전문가)

import java.util.Scanner;
 
public class Main {
 
	public static void main(String[] args) {
 
		Scanner in = new Scanner(System.in);
        
		int A = in.nextInt();
		int B = in.nextInt();
        
        in.close();
        
		A = Integer.parseInt(new StringBuilder().append(A).reverse().toString());
		B = Integer.parseInt(new StringBuilder().append(B).reverse().toString());
		
		System.out.print(A > B ? A : B);
	
	}
}

append()는 기존에 내용이 있다고 하면 그 뒤에 추가하여 저장 (문자열 마지막에 내용을 추가함)

https://itprogramming119.tistory.com/entry/JAVA-39-%EC%A0%84%EB%8B%AC%EB%90%9C-%EA%B0%92%EC%9D%84-%EB%AC%B8%EC%9E%90%EC%97%B4%EB%A1%9C-%EB%B3%80%ED%99%98%ED%95%9C-%ED%9B%84-%ED%95%B4%EB%8B%B9-%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%98-%EB%A7%88%EC%A7%80%EB%A7%89%EC%97%90-%EC%B6%94%EA%B0%80%ED%95%98%EB%8A%94-append-%EB%A9%94%EC%86%8C%EB%93%9C-StringBuffer-%ED%81%B4%EB%9E%98%EC%8A%A4

 

[JAVA] append() - 문자열의 마지막에 추가하는 메소드

  append() 메소드 - 인수로 전달된 값을 문자열로 변환한 후, 해당 문자열의 마지막에 추가합니다. 즉, 이어 붙이는 것입니다. - 이 메소드는 String 클래스의 concat() 메소드와 같은 결과지만, 내부적

itprogramming119.tistory.com

47. 5622

import java.util.*;


public class Main {
 
	public static void main(String[] args)  {
 
		Scanner sc = new Scanner(System.in);
        
		String [] D = {"ABC","DEF","GHI","JKL","MNO","PQRS","TUV","WXYZ"};
		String S = sc.next();
       
		int cnt=0;
		
        for(int i=0;i<8;i++) {
        	for(int j=0;j<S.length();j++) {
        		
        		if(D[i].indexOf(S.charAt(j))!=-1) {
        			cnt += 3+i; // 2번부터 시작하고 2번은 3초 걸린다.
        		}
        	}
        }
        System.out.println(cnt);			
	
	}
}

48. 2941

import java.util.*;

class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		String S = sc.next();
		String arr[] = {"c=","c-","dz=","d-","lj","nj","s=","z="};
		
		
		for(int i=0;i<arr.length;i++) {
			S = S.replace(arr[i],"0");
		}
		
		System.out.println(S.length());
	}
}

replace로 문자열을 치열하고 치열된 개수를 세었음

https://coding-factory.tistory.com/128

 

[Java] 문자열 치환(Replace) 사용법 & 예제

String변수나 배열 같은 곳에 많은 양의 데이터들이 들어가 있을 경우 자신이 바꾸고자 하는 값만 골라서 바꾸기란 쉽지 않습니다. 이럴 때 유용하게 쓰일 수 있는 함수가 바로 Replace함수입니다.

coding-factory.tistory.com

49. 1316

import java.util.*;

class Main{
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		int N = sc.nextInt(),cnt=0;
		boolean B[] = new boolean[N];
	
		for(int i=0;i<N;i++) {
		String S =sc.next();
			
			for(int j=0;j<S.length()-1;j++) {
				
				if(S.charAt(j)!=S.charAt(j+1)) {
					for(int k=0;k<=j;k++) {
						if(S.charAt(j+1)==S.charAt(k)) {
							B[i]=true;
						}
					}
					
				}
				
			}
			
		}
		
		for(int i=0;i<N;i++) {
			if(B[i]==true) {
				cnt++;
			}
		}
		
		System.out.println(N-cnt);
		
	}
}

예를들어 7번과 8번의 문자가 다를때, 8번을 기준으로 1번부터 7번까지 비교후 같은 문자가 있으면 true를 반환하고

입력 수(N)에서 그룹단어가 아닌 수만큼 빼줌

 

50. 1712

import java.util.*;

class Main{
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int arr[] = new int[3];
		int cnt=0;
		
		for(int i=0;i<3;i++) {
			arr[i]=sc.nextInt();
		}
		
		int p = arr[2]-arr[1];
		
		if(p<1){
				cnt=-1;
		}
		
		else {
			cnt = (arr[0])/(arr[2]-arr[1])+1;
			
		}
		
		System.out.println(cnt);
		
		
	}
}

A는 고정값 C에서 B를 뺀값이 이익임. 고정값을 넘기면 그 이상부터는 순 이익이다.

 

51. 2292

import java.util.*;

class Main{
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		int N =sc.nextInt();
		
		int cnt = 1;
		int ran = 2;
		
		if(N == 1) {
			System.out.println(1);
		}
		
		else {
			while(ran<=N) {
				ran = ran +(6*cnt);
				cnt++;
			}
			System.out.print(cnt);
		}
		
	}
}

처음을 제외하고 6n 만큼씩 증가함 (1->6->12->18->24-> ...) ran은 범위로 2부터 시작함. 

ex ) N=58  이면  ran은 다음과 같이 증가.

cnt ran = ran + 6*cnt
2 8   2 + 6
3 20   8 + 12
4 38   20 + 18
5 62   38 + 24

cnt = 5

 

52. 1193

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

class Main{
	public static void main(String[] args) throws IOException {
		
	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	int N = Integer.parseInt(br.readLine());
	int cnt=1;	
	int top=1;
	int bot=1;
	
	if(N==1) {
		System.out.println(top+"/"+bot);
	}
	
	else {			
		while(N>0) {
		N=N-cnt; // 어느 그룹에 속하는지 찾음
		cnt++; // 그룹의 수는 1씩 증가함
	}	
		cnt--;	// 마지막에 1을 한번 더 더해줘서 1을 빼줌
		N=cnt+N; // 그룹에 몇번째인지 저장함
		
		
		if((cnt%2)==0) {  // 짝수일때는 그룹에서 순서가 분자 , 몇번째 그룹 - 분자 = 분모
			top = N; 
			bot = (cnt+1)-top;
	}
		else {  // 홀수일때는 그룹에서 순서가 분모 , 몇번째 그룹 - 분모 = 분자
			bot = N;
			top = (cnt+1)-bot;
		}
	
		System.out.println(top+"/"+bot);
	}
	}
}
그룹(분자 분모 합) 1 2 3 4 5
2 1/1 (1)        
3 1/2 (2) 2/1      
4 3/1 (4) 2/2 1/3    
5 1/4 (7) 2/3 <-(8) 3/2 4/1  
6 5/1 (11) 4/2 3/3 2/4 1/5

예를 들어 8을 입력 했을 때

결과 N N cnt cnt++
7 8 1 2
5 7 2 3
2 5 3 4
-2 2 4 5

cnt는 5가 나옴.

여기에 cnt--인 값을 결과N에 더해주면 그룹에 몇번째인지 알 수 있음.

 

53. 2869

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

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 A = Integer.parseInt(st.nextToken());
		int B = Integer.parseInt(st.nextToken());
		int C = Integer.parseInt(st.nextToken());
	
		int day = (C-B)/(A-B) ;
		// 정상에 도달하면 미끄러지지 않는다.
		// 잔여 높이가 없다면 상관 없지만 만약 잔여 높이가 있다면?
		
		
		if((C-B)%(A-B)!=0) {
			day++;
		}
			

		
		System.out.println(day);
	}
}

 

 

하루에 한칸씩 올라간다.

그런데 5일이 아니라 4일이 걸린다.

그 이유는 정상에 도달하면 미끄러지지 않기 때문이다.

 

그래서 마지막에 미끄러지는 날을 한번 총 길이에서 빼주고 오른 미터수 - 내린 미터수를 해준것을 나눠주면 된다.

몫이 딱 떨어지면 좋겠지만 잔여가 남는 경우에는 하루 더 추가해준 것이다.

 

(총길이-미끄러진 미터 수(도착전 날)) / (오른 미터 수 - 미끄러진 미터 수)

 

54. 10250

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

class Main{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N =Integer.parseInt(br.readLine());
		StringBuilder sb = new StringBuilder();
		
		
		for(int i=0;i<N;i++) {
		StringTokenizer st = new StringTokenizer(br.readLine()," ");
		
		int A = Integer.parseInt(st.nextToken());
		st.nextToken(); //필요없는 수
		int C = Integer.parseInt(st.nextToken());
		
		if((C%A)==0){
			sb.append((A*100)+(C/A)).append('\n');
		}
		// 존재하는 층수의 배수가 C번째 손님일 경우
		// 층수는 A고 호수는 C/A임
		
		else {
			sb.append(((C%A)*100)+((C/A)+1)).append('\n');
		}
		// 배수가 아닌 경우 층수는 (C%A)*100 이고
		// 호수는 (C/A)+1 [+1해주는 이유: 0호가 없다(몫이 0부터 존재함)]
		
		}
	
		System.out.println(sb);
	
	
	}
}

55. 2775

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

class Main{
	public static int[][] APT = new int [15][15];
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		int N = Integer.parseInt(br.readLine());
				
		make_APT();
		
		for(int i=0;i<N;i++) {
			int A = Integer.parseInt(br.readLine());
			int B = Integer.parseInt(br.readLine());
			sb.append(APT[A][B]).append('\n');
			
		}
		System.out.println(sb);
	}
	
	public static void make_APT() {
		for(int i=0;i<15;i++) {
			APT[i][1] =1;
			APT[0][i] =i;			
		}
		
		for(int i=1;i<15;i++) {
		
			for(int j=2;j<15;j++) {
			APT[i][j] = APT[i][j-1]+APT[i-1][j];
		}
		}
		
	}
}

몇층이든 1호는 1명일 수 밖에 없음.

원하는 층 , 원하는 호에 살기 위해서는 원하는 층의 전 호수와 원하는 전 층 원하는 호수에 합이다.

 

56. 2839

import java.io.*;

class Main{
		
	public static void main(String[] args) throws IOException {
	
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	
		int N = Integer.parseInt(br.readLine());
		
		cnt(N);
	
	}
		
	
	public static void cnt(int N) {
	
		if((N==7)||(N==4)) {
			System.out.println(-1);
		}
		
		else if((N%5)==1||(N%5)==3) {
			System.out.println((N/5)+1);
		}
		
		else if((N%5)==2||(N%5)==4) {
			System.out.println((N/5)+2);
		}
		
		else if(N%5==0) {
			System.out.println(N/5);
		}
		
	}
}

색으로 표시한 부분에 규칙이 보인다.(안보이면 바보임.) -> 파랭이들 : 몫 +1    노랭이들 : 몫 +2

 

57. 10757

import java.io.*;
import java.math.BigInteger;
import java.util.StringTokenizer;

class Main{
		
	public static void main(String[] args) throws IOException {
	
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	
		StringTokenizer st = new StringTokenizer(br.readLine()," ");
		
		BigInteger A = new BigInteger(st.nextToken());
		BigInteger B = new BigInteger(st.nextToken());
		
		A=A.add(B);
		
		System.out.println(A.toString());
		
	}
}

BigInteger은 long을 넘어서는 값을 받을 때 쓰인다.

이때, 더하기는 +가 아닌 .add()를 쓴다.

이 문제는 함수로 간단하게 처리 할 수도 있지만, 더하기 로직을 직접 짜서 만들 수 있다. 그건 더 익숙해지면 학습하자.

https://st-lab.tistory.com/199

 

[백준] 10757번 : 큰 수 A+B - JAVA [자바]

www.acmicpc.net/problem/10757 10757번: 큰 수 A+B 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오. www.acmicpc.net 문제 Java로 풀 경우 매우 쉽게 풀 수 있는 문제다. 알고리즘 [접근..

st-lab.tistory.com

 

58. 1978

소수는 약수가 1과 자기자신 뿐이다.

이걸 이용해서 풀면

import java.util.Scanner;

public class Main{
	
	public static void main(String[] args){
		
		Scanner scan = new Scanner(System.in);
		int t,ans=0;
		t=scan.nextInt();
		while(t>0){
			t--;
			int a,cnt=0;
			a=scan.nextInt();
			for(int i=1;i<=a;i++){
				if(a%i==0)cnt+=1;
			}
			if (cnt==2) ans+=1;
		}
		System.out.println(ans);
	}
}

1과 자기자신을 약수로 가지는 수만 ans해준다.

 

정석으로 풀면

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

class Main{
	static int arr[]= new int[1000];
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		br.readLine();
		int cnt=0;
		
		StringTokenizer st = new StringTokenizer(br.readLine()," ");
		
		while(st.hasMoreTokens()) {
			
			boolean result = true;
			
			int num = Integer.parseInt(st.nextToken());
			
			if(num==1) {
				continue;
			}
			
			for(int i=2;i<= Math.sqrt(num);i++) {
				if(num % i == 0) {
					result = false;
					break;
				}
			}
			if(result) {
				cnt++;
			}
		}
		System.out.println(cnt);
	}
}

위와 같다.

Math 함수는 아래를 보자.

https://blog.naver.com/lamkid90/222704646166

 

[자바 (Java)] Math Class (수학 관련 Class) (D+3)

package ch02; public class Ch02Ex22 {  public static void main(String[] args) {  System.out.printl...

blog.naver.com

hasMoreTokens는 아래에서 확인하자

https://crazykim2.tistory.com/473

 

[JAVA] StringTokenizer, hasMoreTokens(), nextToken() 알아보자!

안녕하세요 JAVA의 기본 클래스인 StringTokenizer와 StringTokenizer 클래스 밑의 메소드 hasMoreTokens(), nextToken()에 대해서 알아보겠습니다 목차 StringTokenizer hasMoreToken() nextToken() StringTokeni..

crazykim2.tistory.com

(StringTokenizer에 토큰이 있어? => true 없어? =>false)

 

소수에는 규칙이 있다.

11의 값이 들어왔다고 하자. 11의 제곱근은 약 3.46이다. 4이상 부터는 2 또는 3이 몫이 되어서 약수가 되지 않거나, 나누어 떨어져서 약수가 되어 검사할 필요가 없다.

 

53을 보자. 53은 소수이다. 제곱근은 약7.29이며, 2,3,4,5,6,7 중에서 나누어 떨어지지 않는다면 그 이상에서도 나누어 떨어지지 않는다.

 

그러면 약수가 아닌 52를 보자. 52의 제곱근은 약 7.28이다. 2,3,4,5,6,7중 2,4는 벌써 52의 약수이다. 7 이후의 수를 나눠주는 것은 의미가 없다.

 

수학적으로 접근하면

12( 제곱근:3.46 )을 2 x 3 의 합성수라고 보면 2는 1보다 크고 3은 12보다 작다. ( 1 ≤ 2, 3 < 12 )

만약 여기서 2와 3이 제곱근 보다 커진다면 4 x 5는 12보다 커져 12가 될 수 없다.

단순하게 생각하자. 소수는 제곱근 보다 큰 수에서 비교할 필요가 없다.

 

+ 제곱근 이상의 수는 구하고자하는 수의 값을 넘어서서 절대 약수가 될 수 없다. 그래서 비교 의미가 없다.

12 => 3 * 3 =9                   4 * 4 =16 (모순)

 

이것 말고도 다른 방법이 있으나 아직 어렵다.

https://st-lab.tistory.com/80

 

[백준] 1978번 : 소수 찾기 - JAVA [자바]

https://www.acmicpc.net/problem/1978 1978번: 소수 찾기 첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다. www.acmicpc.net 문제 드디어 새로..

st-lab.tistory.com

시간은 아래가 더 빠른다.

 

 

59. 2581

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

class Main{
	static int arr[]= new int[1000];
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int M= Integer.parseInt(br.readLine());
		int N= Integer.parseInt(br.readLine());
		int sum=0,first=0;
		
		for(int num=M;num<=N;num++) {
			int cnt=0;
					
			for(int i=1;i<=num;i++) {
				if(num % i == 0) {
					cnt+=1;
				}
				
			}
			if(cnt==2) {
				sum+=num;
			} // 소수인 아이들 더해줌
			
			if(sum==num) {
				first=num;
			} // 처음 값은 first에 저장해줌
			
		}	
		
		
		if(sum==0) {
			System.out.println(-1);
		}
		
		else {
			System.out.println(sum);
			System.out.println(first);
		}
		
	}
}

솔직히 소수는 위와 같은 방법이 편한거 같다. 

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

class Main{
	static int arr[]= new int[1000];
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int M= Integer.parseInt(br.readLine());
		int N= Integer.parseInt(br.readLine());
		int sum=0,first=0;
		
		for(int num=M;num<=N;num++) {
			int cnt=0;
			boolean result = true;
			
			if(num==1) {
				continue;
			}
			
			for(int i=2;i<=Math.sqrt(num);i++) {
				if(num % i == 0) {
					result =false;
					break;
				}
				
			}
			if(result) {
				sum+=num;
			} // 소수인 아이들 더해줌
			
			if(sum==num) {
				first=num;
			} // 처음 값은 first에 저장해줌
			
		}	
		
		
		if(sum==0) {
			System.out.println(-1);
		}
		
		else {
			System.out.println(sum);
			System.out.println(first);
		}
		
	}
}

시간은 이게 더 빠름

 

60. 11653

import java.io.*;

class Main{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringBuilder sb = new StringBuilder();
		int N = Integer.parseInt(br.readLine());
		
		for(int i=2;i<=Math.sqrt(N);i++) {
        
			while((N%i)==0) {
				sb.append(i).append('\n');
				N /= i;
			}
		}
		
		if(N != 1) {
			sb.append(N); //제곱근 까지 반복문이 수행되므로, 나머지 값을 저장.
		}
					
		System.out.println(sb);
	}
}

61. 4948

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

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 M = Integer.parseInt(st.nextToken());
		int N = Integer.parseInt(st.nextToken());
		
		for(int num=M;num<=N;num++) {
			boolean B = true;
			
			if(num==1) {
				continue;
			}
			
			for(int i=2;i<=Math.sqrt(num);i++) {
				if(num%i==0) {
					B = false;
					break;
				}
				
			}
			
			if(B) {
				System.out.println(num);
			}
			
		}
	
	}
}

크게 설명이 필요하지 않다.

 

62. 4948

import java.io.*;

class Main{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringBuilder sb = new StringBuilder();
		
		while(true) {
		int n = Integer.parseInt(br.readLine());
		int cnt =0;
		
		if(n==0) {
			break;
		}
		
		for(int num=(n+1);num<=(2*n);num++) {
			boolean B = true;
						
			if(num==1) {
				continue;
			}
			
			for(int i=2;i<=Math.sqrt(num);i++) {
				if(num%i==0) {
					B = false;
					break;
				}
				
			}
			
			if(B) {
				cnt++;
			}
		}
		sb.append(cnt).append('\n');
		}
		System.out.println(sb);
	}
}

다 좋은데 시간이 조금 느리다.

 

63. 9020

import java.io.*;

class Main{
	public static boolean[] arr = new boolean[10001];
	
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		get_prime(); // 배열에 소수가 아니면 true, 소수면 false을 입력
		
		int T = Integer.parseInt(br.readLine());
		
		for(int i=0;i<T;i++) {
			int n = Integer.parseInt(br.readLine());
			int A = n/2, B = n/2;
			
			while(true) {
				if(!arr[A]&&!arr[B]) {
					sb.append(A).append(' ').append(B).append('\n');
					break;
				}
				A--;
				B++;
			}
		}
		System.out.println(sb);
	}			
	
	public static void get_prime() {
		arr[0]=arr[1]=true;
		
		for(int i=2;i<Math.sqrt(arr.length);i++) {
			if(arr[i]) {
				continue;
                // 이미 판별된 값들은 지나친다.
                // (i가 4일때, 2의 배수로 소수를 판멸하여 건너뛴다.)
			}
			for(int j = i*i;j<arr.length;j+=i) {
				arr[j]=true;
                // i의 배수들은 i를 약수로 가져 소수가 아니다.
			}
		}				
	}
}

기존 제곱근 방법을 이번 문제에 적용시키면 알고리즘이 복잡해지고 시간이 많이 걸릴 것이다.

 

그래서 블로그에서 소개시켜준 마지막 방법을 사용해봤다.

 

에베르토스테네스의 체이다.

2의 배수는 2의 약수여서 소수가아니다.

3의 배수는 3의 약수여서 소수가아니다.

4는 이미 2를 약수로 갖는다.

5의 배수는 5의 약수여서 소수가아니다........

 

이 방법을 이용한 것이고, 제곱근 이후 값은 (1978)번 문제에서 설명한 것과 같이 비교가 필요 없다.

따라서 시간이 많이 절약된다. O(N(log(logN)))

 

64. 1085

매우 간단하지만 math.min함수를 모르면

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

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 x=Integer.parseInt(st.nextToken());
		int y=Integer.parseInt(st.nextToken());
		int w=Integer.parseInt(st.nextToken());
		int h=Integer.parseInt(st.nextToken());
		
		int A=x-0,B=w-x,C=y-0,D=h-y;
		
		if(A<=B && A<=C && A<=D) {
			System.out.println(A);
		}
		
		else if(B<=A && B<=C && B<=D) {
			System.out.println(B);
		}
		
		else if(C<=A && C<=B && C<=D) {
			System.out.println(C);
		}
		else {
			System.out.println(D);
		}
	}		
}

A,C는 안써줘도 됨

만약 math.min 함수를 안다면

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

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 x=Integer.parseInt(st.nextToken());
		int y=Integer.parseInt(st.nextToken());
		int w=Integer.parseInt(st.nextToken());
		int h=Integer.parseInt(st.nextToken());
		
		int x_min = Math.min(x, w-x);
		int y_min = Math.min(y, h-y);
		
		System.out.println(Math.min(x_min, y_min));
	
	}		
}

 

65. 3009

어렵지는 않다.

비트연산자를 이용하면 (XOR 연산자 -> ^)

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

class Main{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		int x=0,y=0;
		
		for(int i=0;i<3;i++) {
		st = new StringTokenizer(br.readLine()," ");
		x ^= Integer.parseInt(st.nextToken());
		y ^= Integer.parseInt(st.nextToken());	
		
		}
		System.out.println(x+" "+y);
	}
}

근데 신기한게. xor 연산을 쓰지 않고 풀이한게 더 빠르다;;

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

class Main{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		StringTokenizer st;
		int x[]=new int[6];
		
		for(int i=0;i<6;i+=2) {
		st = new StringTokenizer(br.readLine()," ");
		x[i] = Integer.parseInt(st.nextToken());
		x[i+1] = Integer.parseInt(st.nextToken());	
		
		}
		
		
		if(x[0]==x[2]) {
			sb.append(x[4]).append(' ');
		}
		else if(x[2]==x[4]){
			sb.append(x[0]).append(' ');
		}
		else {
			sb.append(x[2]).append(' ');
		}
		
			
		if(x[1]==x[3]) {
			sb.append(x[5]);
		}
		else if(x[3]==x[5]){
			sb.append(x[1]);
		}
		else {
			sb.append(x[3]);
		}
		
		System.out.println(sb);
		
	}		
}

어쨋든 연산자 추가적인 공부는 아래를 참조하자.

https://phantom.tistory.com/19

 

[Java] 자바 연산자 (Java Operator)

이번 포스트에서는 자바 연산자에 대해 알아보겠습니다. 연산자 (Operator) 정의 프로그램에서 데이터를 처리하여 결과를 산출하는 것을 연산(operation)이라 한다. 연산에 사용되는 표시나 기호를

phantom.tistory.com

66. 4153

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

class Main{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		while(true) {
		StringTokenizer st = new StringTokenizer(br.readLine()," ");
		int A = Integer.parseInt(st.nextToken());
		int B = Integer.parseInt(st.nextToken());
		int C = Integer.parseInt(st.nextToken());
		
		if(A==0 && B==0 && C==0) {
			break;
		}
		
		if(((A*A+B*B)==C*C)||((A*A+C*C)==B*B)||((C*C+B*B)==A*A)) {
			sb.append("right").append("\n");
		}
		
		else {
			sb.append("wrong").append("\n");
		}
			
		}
		System.out.println(sb);
	}
}

무지 쉽다. 근데 right를 rigth로 써서 틀렸다.. ㅋㅋㅋ;;;;

 

67. 3053

import java.io.*;

class Main{
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		double R = Double.parseDouble(br.readLine());
		double pi = Math.PI;
		
		System.out.printf("%.6f\n",pi*R*R);
		System.out.printf("%.6f",R*R+R*R);
		
	}
}

68. 1002

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

class Main{
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int T = Integer.parseInt(br.readLine());
		StringTokenizer st;
		StringBuilder sb = new StringBuilder();
		
		for(int i=0; i<T;i++) {
			st = new StringTokenizer(br.readLine());
			int x1 = Integer.parseInt(st.nextToken());
			int y1 = Integer.parseInt(st.nextToken());
			int r1 = Integer.parseInt(st.nextToken());
			int x2 = Integer.parseInt(st.nextToken());
			int y2 = Integer.parseInt(st.nextToken());
			int r2 = Integer.parseInt(st.nextToken());
			
			sb.append(target(x1, y1, r1, x2, y2, r2)).append('\n');
			
		}
		System.out.println(sb);
	}
	
	public static int target(int x1, int y1, int r1,int x2, int y2, int r2) {
		
		int distance = (int)((Math.pow(x2-x1, 2)) + (Math.pow(y2-y1, 2)));
		
		if(x1 == x2 && y1 == y2 && r1==r2) return -1;
		
		else if(distance > Math.pow(r1+r2, 2))	return 0;
		
		else if(distance < Math.pow(r2-r1, 2)) 	return 0;
		
		else if(distance == Math.pow(r2-r1, 2)) return 1;
		
		else if(distance == Math.pow(r1+r2, 2)) return 1;
		
		else return 2;
							
	}
}

1) 위치 가능성 무한대

두 좌표와 두 반지름의 길이가 같다

𝑥₁ = 𝑥₂, 𝑦₁ = 𝑦𝑟₁ = 𝑟₂

 

2) 위치 가능성 없음

각 원의 반지름의 크기가 더 크다.

(𝑥 - 𝑥₁)² + (𝑦₂ - 𝑦₁)²  > (𝑟₁ + 𝑟₂)²

(𝑥 - 𝑥₁)² + (𝑦₂ - 𝑦₁)²  <  (𝑟 - 𝑟₁)² 

 

3) 위치 가능성 1

접점이 하나이다.

(𝑥 - 𝑥₁)² + (𝑦₂ - 𝑦₁)²  =  (𝑟 - 𝑟₁)² 

(𝑥 - 𝑥₁)² + (𝑦₂ - 𝑦₁)²  =  (𝑟 + 𝑟₁)² 

 

69. 10872 (팩토리얼)

import java.io.*;

class Main{
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());
		
		System.out.println(pactorials(N));
		
		
	}
	
	public static int pactorials(int N) {
		if(N < 1) {
			return 1;
		}
		
		else {
			int n=N-1;
			return N*pactorials(n);
		}
	}
}

재귀함수 활용

 

70 . 10870 (피보나치 수열)

import java.io.*;

class Main{
	
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int n = Integer.parseInt(br.readLine());
		
		System.out.println(fibonacci(n));
				
		
	}
	
	public static int fibonacci(int n){								
		
		if(n==1 || n==2) {
			return 1;
		}
		
		else if (n==0) {
			return 0;
		}
		
		else {
			return fibonacci(n-1)+fibonacci(n-2);
		}
		
	}
}

재귀함수 활용

71. 2447

쉬운데 느림

import java.io.*;

class Main{
	static StringBuilder sb = new StringBuilder();
	
	public static void star(int x, int y, int n) {
		if((x / n) % 3 == 1 && (y / n) % 3 == 1){
			sb.append(" ");
		}
		else if(n / 3 == 0) {
			sb.append("*");
		}
		else {
			star(x, y, n/3);
		}
	}
	
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int n = Integer.parseInt(br.readLine());
		
		for(int i=0; i<n; i++) {
			for(int j=0; j<n; j++) {
				star(i, j, n);
			}
			sb.append('\n');
		}
		
		System.out.println(sb);
	}
}

어려운데 빠름

import java.io.*;

class Main{
	static char[][] arr;
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		int N = Integer.parseInt(br.readLine());
		
		arr = new char[N][N]; //정사각형
		
		star(0, 0, N, false); // 초기값
		
		for(int i = 0; i < N; i++) {
			for(int j = 0; j < N; j++) {
				sb.append(arr[i][j]);
			}
			sb.append('\n');
		}
		System.out.println(sb);								
	}
	
	public static void star(int x, int y, int N, boolean blank){								
		
		if(blank) {
			for(int i=x; i< x+N; i++) {
				for(int j = y; j<y+N; j++) {
					arr[i][j] = ' ';
				}
			}
			return;
		}
		
		if(N == 1) { //더이상 3으로 나눠지지 않을 때
			arr[x][y] = '*';
			return;
		}
		
		int size = N / 3;
		int cnt = 0;
		
		for(int i=x; i<x+N; i+=size) {
			for(int j=y; j<y+N; j+=size) {
				cnt++;
				if(cnt == 5) {
					star(i, j, size, true);
				}
				else {
					star(i, j, size, false);
				}
			}
		}						
	}
}

배열을 이용한 방법과 나머지를 이용한 방법이다.

두 방법 모두 자바는 나누기를 따로 선언하지 않으면 소수점은 버리는 점을 이용한 것이다.

예를 들어 10/3 은 3.xx 나오지만 0.xx는 버려 3이 나온다.

 

쉬운 로직으로 설명하면.

위의 그림에서 x축과 y축을 3으로 나눴을 때 1이 나왔을 경우를 만족 했을 때 *이 표시 되지 않는다.

그 점을 이용한 것이다.

만약 위 조건이 해당되지 않는다면 *을 표시한다. 해당 되지 않는 조건은 입력받은 n을 3으로 계속 나눠주면서

마지막에 1/3 는 0이 표시 되기 때문에 n==0이면 *을 표시하는 것이다.

 

반복문을 통해도 처리가 가능하지만, 재귀 함수를 이용한 처리 방식이다.

 

72. 11729

import java.io.*;

class Main{
	static int cnt = 0;
	static StringBuilder sb = new StringBuilder();
	public static void Hanoi(int n, int top, int mid, int bot) {
		cnt++;
		if(n==1) {
			sb.append(top).append(' ').append(bot).append('\n');
			return;
		}
		
		else {
			Hanoi(n-1, top, bot, mid); // 1 3 2
			sb.append(top).append(' ').append(bot).append('\n');
			Hanoi(n-1, mid, top, bot); // 2 1 3
		}
		
		//print는 top , bot 고정 시킨 후 이동
		
	}
	
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());
		
		Hanoi(N, 1, 2, 3);
		
		System.out.println(cnt + "\n" + sb);
		
		
	
	}
}

 

출력 결과는 몇번에서 몇번으로 이동했는지를 표시해준다.

1
2
3

다음 같이 진행된다.

print 에서 top bot 위치는 고정이다.

1 2 가 출력 되기 위해 top bot mid 1 3 2 로 바꿔줘야한다.

3 2 가 출력 되기 위해 위에 1 3 2 에서 3 1 2 로 바꿔 줘야 한다.

위 표를 보면 mid -> top , top -> mid로 바꿔준 것을 알 수 있다. 

따라서 mid top bot이 된다.

 

(실제 실행 순서는 6번 5번으로 진행됨)

 

73. 2798

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

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];
		int max = 0;
		
		st = new StringTokenizer(br.readLine());
		
		for(int i=0;i<N;i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}
		
		for(int i=0; i<N-2; i++) {
			for(int j=1+i; j<N; j++) {
				for(int k=1+j; k<N; k++) {
					int sum = arr[i]+arr[j]+arr[k]; 
					
					if(sum > max && sum <= M) {
						max = sum;
					}
				}
			}
		}
		
		System.out.println(max);
		
	}
}

조금 생각해보면 크게 어렵지 않은 문제

 

74. 17478

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class Main{
	static String under = "";
	public static void re(int N) {
		String line = under;
		
		if(N==0) {
			System.out.println(line + "\"재귀함수가 뭔가요?\"");
			System.out.println(line + "\"재귀함수는 자기 자신을 호출하는 함수라네\"");
			System.out.println(line + "라고 답변하였지.");
			return;
		}
		
		System.out.println(line +"\"재귀함수가 뭔가요?\"");
		System.out.println(line +"\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.");
		System.out.println(line +"마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.");
		System.out.println(line +"그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\"");
		
		under += "____";
		
		re(N-1);
		
		System.out.println(line+"라고 답변하였지.");
		
	}
	
	public static void main(String[] args)throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());
		
		System.out.println("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.");
		re(N);
		
		
	}
}

재귀함수가 뭔지 알 수 있는 문제

 

75. 25083

class Main{
	public static void main(String[] args) {
		System.out.println("         ,r'\"7");
		System.out.println("r`-_   ,'  ,/");
		System.out.println(" \\. \". L_r'");
		System.out.println("   `~\\/");
		System.out.println("      |");
		System.out.println("      |");
	}
	
}

76. 2231

import java.io.*;

class Main{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());
		
		int result = 0;
		
		for(int i=0; i<N; i++) {
			int num = i;
			int sum = 0;
		
		
		while(num!=0) {
			sum += num % 10;
			num /= 10;
		// 각 자리수를 더해주기 위함	
			}
		
		if((sum + i)==N) {
			result = i;
			break;
			}
		}
	System.out.println(result);	
	}
}

브루트 포스 : 하나씩 대입하면서 암호를 해독 하는 방법

 

77. 7568

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

class Main{
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		StringBuilder sb = new StringBuilder();
		int N = Integer.parseInt(br.readLine());
		int cnt;
		int arr_1[] = new int[N];
		int arr_2[] = new int[N];
		
		for(int i=0; i<N; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			arr_1[i] = Integer.parseInt(st.nextToken());
			arr_2[i] = Integer.parseInt(st.nextToken());			
		}
		
		for(int i=0; i<N; i++) {
			cnt=1;
			for(int j=0;j<N; j++) {
				if(arr_1[i]<arr_1[j] && arr_2[i]<arr_2[j]) {
					cnt++;
				}
			}
			sb.append(cnt).append(' ');
		}
		System.out.println(sb);
	}
}

 문제만 이해하면 크게 어렵지 않다.

 

78. 1018

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

class Main{
	
	public static boolean[][] arr;
	public static int min = 64;
	
	
	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());
		
		arr = new boolean[N][M];
		
		for(int i=0; i<N; i++) {
			String str = br.readLine();
			for(int j=0;j<M;j++) {
				if(str.charAt(j)=='W') {
					arr[i][j] = true;
				}
				else {
					arr[i][j] = false;
				}
			}
		}
		
		int N_row = N-7;
		int M_col = M-7;
		
		for(int i=0; i< N_row; i++) {
			for(int j=0;j< M_col;j++) {
				find(i,j);
				}
			}
			System.out.println(min);				
	}
	
	public static void find(int x, int y) {
		int end_x = x + 8;
		int end_y = y + 8;
		int cnt = 0;
		
		boolean TF = arr[x][y];
		
		for(int i=x; i<end_x; i++) {
			for(int j=y;j<end_y;j++) {
				if(arr[i][j] != TF) {
					cnt++;
				}
				TF=(!TF); /다음 패턴은 W면 B가 B면 W가 되므로,
				}
			TF=(!TF);
			}
		
		cnt = Math.min(cnt, 64 - cnt);
		
		min = Math.min(min, cnt);
	}
}

처음 접해서 어려웠음. 근데 쉬운 문제래...

8*8의 체스판을 만들기 위함으로 8*8 WB혹은 BW 패턴에서 맞지 않는 패턴이 가장 적은 쪽을 잘라서 사용함.

먼저 boolean을 통해서 입력받은 값을 저장하고, 비교를 한다.

그후  find  에서 비교하기 되는데 로직은 그림처럼 진행된다.

(로직이 N-7, M-7이 나오는 이유는 8*8체스판을 찾기 위함이고 아래 그림을 보면 더 이해가 갈것이다.)

검정 -> 주황 -> 빨강 -> .... 순으로  가장 체스판 패턴과 적합한 부분을 찾는다(Math.min을 통해서)

결과 값은 찾은 가장 적합한 체스판 패턴에서 고쳐야 할 부분이다.

따라서,

다음과 같이 중간에 체스판 패턴이 있으니 맨뒤에 WWW가 있든 말든 다시 칠해야 할 부분은 0 이 된다.

 

79. 1436

import java.io.*;

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

		int num = 666;
		int cnt = 1;
		
		while(cnt != N) {
			num++;
			
			if(String.valueOf(num).contains("666")) {
				cnt++;
			}
		}
		System.out.println(num);
	}
}

※ contains() : 찾고자하는 문자열이 있는지 확인한다.

문자열 변환 함수는 toString() , String.valueof(), (String)이있다. 

하지만 다음과 같은 문제가 있다.

int intNum      = 1;
Object objNull  = null;
Object objnum   = new Integer(1);
​
// toString
String str1 = intNum.toString(intNum);  // 컴파일 에러
String str2 = objNull.toString();       // NullPointerException
String str3 = objnum.toString();
​
// (String)
String str4 = (String)intNum;       // 컴파일 에러
String str5 = (String)objNull;
String str6 = (String)objnum;       // ClassCastException
​
// String.valueOf()
String str7 = String.valueOf(intNum);
String str8 = String.valueOf(objNull);
String str9 = String.valueOf(objnum);

즉, String.valueOf()가 문자열 변환이 어떠한 것이든 문제 없이 가능하다.

속도가 느리지만 간단한 코드. (666x x666 x666x)만 비교하는 방법은 후에 살펴보자.

 

80. 2750

import java.io.*;

class Main{
	
	public static void main(String[] args)throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		int[] arr = new int[N];
		int temp = 0;
		
		for(int i=0;i<N;i++) {
			arr[i] = Integer.parseInt(br.readLine());
		}
		
		for(int i=0;i<N;i++) {
			for(int j=i;j<N;j++) {
				if(arr[j] < arr[i]) {				
				temp = arr[i];						
				arr[i] = arr[j];
				arr[j] = temp;
				}
			}
		}
		for(int i=0; i<N; i++) {
			System.out.println(arr[i]);
		}
	}
}

삽입 정렬.

 

81. 2751

(1) 컬렉션 프레임 워크 이용 (Collections.sort())

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

class Main{
	
	public static void main(String[] args)throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int N = Integer.parseInt(br.readLine());
		
		
		ArrayList<Integer> al = new ArrayList<>();
		
			
		for(int i=0;i<N;i++) {
			al.add(Integer.parseInt(br.readLine()));
		}
		
		Collections.sort(al);
		
		for(int i : al) {
			sb.append(i).append('\n');
		}
		System.out.println(sb);
	}
}

(2) counting sort 이용

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

class Main{
	
	public static void main(String[] args)throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		boolean[] arr = new boolean[2000001];
		// 기준점 0 = 1000000 범위는 -1000000~ 1000000
		
		int N = Integer.parseInt(br.readLine());
		
		for(int i=0; i < N; i++) {
			arr[Integer.parseInt(br.readLine())+1000000] = true;
		}
		
		for(int i=0; i < arr.length; i++) {
			if(arr[i]) {
				sb.append((i-1000000)).append('\n');
			}
		}
		System.out.println(sb);
	}
}

(2) 의 알고리즘은 아래와 같다.

Collections.sort는 Timsort 기반으로 O(N) ~ O(NlogN) 의 시간복잡도를 보장한다.

카운팅 정렬은 O(N)의 시간 복잡도를 보장한다.

 

백준에서는 카운팅 정렬을 이용하자. (실생활에서는 퀵정렬이나 팀 정렬을 이용한다.)

 

82. 10989

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args)throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int [] B = new int[10001];

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

        for(int i=0; i<N; i++){
            B[Integer.parseInt(br.readLine())]++;

        }
        for(int i=1; i<B.length; i++){
            while(B[i] > 0){
                sb.append(i).append('\n');
                B[i]--;
            }
        }
        System.out.println(sb);
    }
}

인덱스 값을 따져줌. 중복이 나오면 해당 인덱스의 값은 1이 증가하고 마지막에 배열에 저장할 때, 인덱스의 값에 따라 저장해 줄 수 있음..

 

83. 2108

package BackJoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int [] arr = new int[8001];
        int N = Integer.parseInt(br.readLine());
        int sum = 0;
        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        int median = 10000;
        int mode = 10000;

        for(int i=0; i<N; i++){
            int value = Integer.parseInt(br.readLine());
            sum += value;
            arr[value + 4000]++;

            if(max < value){
                max = value;
            }
            if(min > value){
                min = value;
            }
        }


        int cnt = 0;
        int mode_max = 0;

        boolean flag = false;

        for(int i = min + 4000; i <= max + 4000; i++ ){
            if(arr[i] > 0){
                if(cnt < (N+1) / 2 ) {
                    cnt += arr[i];
                    median = i - 4000;
                }

                if(mode_max < arr[i]){
                    mode_max = arr[i];
                    mode = i - 4000;
                    flag = true;
                }

                else if(mode_max == arr[i] && flag == true){
                    mode = i - 4000;
                    flag = false;
                    }
            }
        }

        System.out.println((int)Math.round((double)sum / N));
        System.out.println(median);
        System.out.println(mode);
        System.out.println(max - min);

    }
}

 

84. 1427

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int [] arr = new int[101];

        String S = br.readLine();

        for(int i=0;i<S.length();i++){
            arr[Character.getNumericValue(S.charAt(i))]++;
        }

        for(int i=arr.length-1;i>=0;i--){
            while(arr[i] > 0){
                sb.append(i);
                arr[i]--;
            }
        }
        System.out.println(sb);
    }
}

char -> Int 변환

https://frhyme.github.io/java/java_basic02_char_to_int/

 

Java - Char를 Int로 변환하기

Java - Char를 Int로 바꾸기

frhyme.github.io

 

85. 11650

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int N = Integer.parseInt(br.readLine());
        int [][] arr = new int [N][2];
        StringTokenizer st;

        for(int i=0; i < N; i++){
            st = new StringTokenizer(br.readLine());
            arr[i][0] = Integer.parseInt(st.nextToken());
            arr[i][1] = Integer.parseInt(st.nextToken());
        }
		
        // Comparator
        // 오버라이딩
        Arrays.sort(arr, (e1, e2) ->{
            if(e1[0] == e2[0]){
                return e1[1] - e2[1];  
                // 두 객체를 비교, e1이 크면 양수를 작으면 음수를 같으면 0을 리턴함
            } else {
                return e1[0] - e2[0];
            }
        });
        // 리턴된 값이 Arrays.sort로 인해 순서가 정리됨.
        
        // 양수 : 위치를 바꿈     0, 음수 : 위치를 바꾸지 않음 
        
        

        for(int i = 0; i < N; i++){
            sb.append(arr[i][0]+ " " +arr[i][1]+"\n");
        }
        System.out.println(sb);
    }
}

람다식을 이용하였다.

람다함수 : 코드를 보다 단순하게 표현하는 방법이다.

https://khj93.tistory.com/entry/JAVA-%EB%9E%8C%EB%8B%A4%EC%8B%9DRambda%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EA%B3%A0-%EC%82%AC%EC%9A%A9%EB%B2%95

 

[JAVA] 람다식(Lambda)의 개념 및 사용법

람다함수란? 람다 함수는 프로그래밍 언어에서 사용되는 개념으로 익명 함수(Anonymous functions)를 지칭하는 용어입니다. 현재 사용되고 있는 람다의 근간은 수학과 기초 컴퓨터과학 분야에서의 

khj93.tistory.com

 

https://hbase.tistory.com/78

 

[Java] 람다식(Lambda Expressions) 사용법 및 예제

자바8에서 '람다식(Lambda Expression)'이 지원되면서 자바는 완전히 새로운 언어처럼 보이기 시작했다. 지네릭스(Generics)가 자바을 크게 변화시킨 것처럼 람다식 역시 자바를 어마어마하게 변화시켰

hbase.tistory.com

만약 람다식으로 쓰지 않았다면

Arrays.sort(arr, new Comparator<int[]>() {		
	@Override
	public int compare(int[] e1, int[] e2) {
		if(e1[0] == e2[0]) {		// 첫번째 원소가 같다면 두 번째 원소끼리 비교
			return e1[1] - e2[1];
		}
		else {
			return e1[0] - e2[0];
		}
	}
});

 

Comparator의 개념

https://st-lab.tistory.com/243

 

자바 [JAVA] - Comparable 과 Comparator의 이해

아마 이 글을 찾아 오신 분들 대개는 Comparable과 Comparator의 차이가 무엇인지 모르거나 궁금해서 찾아오셨을 것이다. 사실 알고보면 두 개는 그렇게 어렵지 않으나 아무래도 자바를 학습하면서 객

st-lab.tistory.com

 

86. 11651

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();

        int N = Integer.parseInt(br.readLine());
        int [][] arr = new int[N][2];

        for(int i = 0; i < N; i++){
            st = new StringTokenizer(br.readLine()," ");
            arr[i][0] = Integer.parseInt(st.nextToken());
            arr[i][1] = Integer.parseInt(st.nextToken());
        }

        Arrays.sort(arr , (e1, e2)->{
            if(e1[1] == e2[1]){
                return e1[0] - e2[0];
            }
            else{
                return e1[1] - e2[1];
            }
        });
        // 0이 x 1이 y 이므로 이전 문제에서 위치만 바꿔줌
     

        for(int i = 0; i < N; i++){
            sb.append(arr[i][0] + " " + arr[i][1] + "\n");
        }

        System.out.println(sb);

    }
}

 

87. 1181

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;


public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int N = Integer.parseInt(br.readLine());
        String[] s = new String[N];


        for(int i = 0; i < N; i++){
            s[i] = br.readLine();
        }

        Arrays.sort(s, new Comparator<String>() {
          //override
          public int compare(String s1, String s2){
              if(s1.length() == s2.length()){
                  return s1.compareTo(s2); // 사전 순으로 정렬함.
              }

              // 길이가 같지 않은 경우
              else{
                  return s1.length() - s2.length();
              }
          }
        });

        sb.append(s[0] + "\n");
        for(int i = 1; i < N; i++){
            if(!s[i].equals(s[i-1])) {
                sb.append(s[i] + "\n");
            }
        }

        System.out.println(sb);

    }
}

만약 람다식으로 바꾼다면

  Arrays.sort(s, (s1 ,s2)-> {
          //override
              if(s1.length() == s2.length()){
                  return s1.compareTo(s2); // 사전 순으로 정렬함.
              }

              // 길이가 같지 않은 경우
              else {
                  return s1.length() - s2.length();
              }
        });

 

정렬하기 글을 봐 보자

https://www.daleseo.com/java-comparable-comparator/

 

[Java] 객체 정렬하기 1부 - Comparable vs Comparator

Engineering Blog by Dale Seo

www.daleseo.com

 

'문제 > 백준_자바' 카테고리의 다른 글

93. 10816(숫자 카드2)  (0) 2022.06.20
92. 1620(나는야 포켓몬 마스터 이다솜)  (0) 2022.06.19
91. 14425 (문자열 집합)  (0) 2022.06.19
90. 10815(숫자카드)  (0) 2022.06.19
[단계별] 백준 (답) java (88~)  (0) 2022.05.06
Comments