• 코드

성공 코드 : 그냥 입력한 수의 꽉찬 정사각형 별찍기

 

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

public class Main {
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int N = Integer.parseInt(br.readLine());
		
		for(int i=0;i<N;i++) {
			for(int j=0;j<N;j++) {
				bw.write("*");
			}
			bw.write("\n");
		}
		
		bw.flush();
		bw.close();
	}
}

 


 

  • 코드

실패 코드 : contains를 통해 해당 문자가 없으면 count를 해주며 count가 K랑 같아졌을 때, 출력 후 반복문을 빠져나오는 식으로 하였다.  결과는 메모리초과

 

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

public class Main {
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
		int K = Integer.parseInt(br.readLine());
		
		int count = 0;
		int i=1;
		while(true) {
			if(!Integer.toString(i).contains("0")
					&& !Integer.toString(i).contains("1")
					&& !Integer.toString(i).contains("2")
					&& !Integer.toString(i).contains("3")
					&& !Integer.toString(i).contains("5")
					&& !Integer.toString(i).contains("6")
					&& !Integer.toString(i).contains("8")
					&& !Integer.toString(i).contains("9"))
				count++;
				
			if(count==K) {
				System.out.println(i);
				break;
			}
			i++;
		}
	}
}

 

성공 코드 : 4와 7로만 나타내는 K번째 수를 입력하면 된다. 여기서 4와 7를 0과 1로만 바꿔서 생각하면 2진수와 같다.

               약간 다른점은 3일때 00이 아닌 10이 된다. 

               해결법은 입력한 수를 +1 한 뒤 2진수로 바꾸면 3일때 100이 된다.

               여기서 맨 앞에 1을 제외시키면 00이 되어서 3일때 44로 정상적으로 바뀌게 된다.

 

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

public class Main {
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		String s = Integer.toBinaryString(Integer.parseInt(br.readLine())+1).replace('0','4').replace('1', '7');
		for(int i=1;i<s.length();i++) 
			bw.write(s.charAt(i));
		
		bw.flush();
		bw.close();
	}
}

 


 

  • 코드

앞의 인덱스의 수 보다 뒤의 인덱스의 수가 더 적으면 swap해주는 식으로 풀었다.

 

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

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

 

 

Arrays.sort를 쓰면 더 빠르고 짧게 정렬할 수 있다.

 

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

public class Main {
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
        int N = Integer.parseInt(br.readLine());
        
        int [] number = new int[N];
        for(int i=0;i<N;i++)
        	number[i] = Integer.parseInt(br.readLine());
       
        Arrays.sort(number);
        
        for(int i=0;i<N;i++)
			System.out.println(number[i]);
		
	}
}

 


 

  • 코드

실패 코드 1 : String으로 특정 순서에 있는 문자를 가져오는 charAt를 통해 가져왔다. 결과는 메모리초과

               이유는 String 클래스 문자열의 최대 가능 길이는 2,147,483,647이기 때문에 뜬 것 같다.

 

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

public class Main {
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
		
        int N = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());
        
        String number = "";
        int a = 0;
        for(int i=1;i<=N;i++) {
        	number+=i;
        	a += Math.log10(i)+1;
        	if(a>=k)
        		break;
        }
        
        if (a>k)
     	    System.out.println(number.charAt(k-1));
        else
    	    System.out.println("-1");
	}
}

 

실패 코드 2 : String 대신에 ArrayList로 해보았다. 결과는 메모리초과

 

 

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

public class Main {
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
		
        int N = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());
        
        ArrayList<String> list = new ArrayList<>();
        
        int a=0;
        boolean check = false;
        
        for(int i=1;i<=N;i++) {
        	a+=Math.log10(i)+1;
        	list.add(Integer.toString(i));
        	if(a>=k) {
        		check = true;
        		a = k-(a-(int)Math.log10(i)-1)-1;
        		break;
        	}
        }
        
        if(check)
        	System.out.println(list.get(list.size()-1).charAt(a));
        else
        	System.out.println("-1");
	}
}

 

실패 코드 3 : 해당 숫자만 String형태로 가져와서 원하는 숫자 1개를 찾아서 출력한다. 잘나오는 것 같은데 틀렸다고 뜬다.. 왜그러지.. 조금 있다가 다시 풀어봐야겠다...슈벌탱

 

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

public class Main {
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
		
        int N = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());
                
        int a=0;
        boolean check = false;
        String temp="";
        
        for(int i=1;i<=N;i++) {
        	a+=Math.log10(i)+1;
        	if(a>=k) {
        		check = true;
        		a = k-(a-(int)Math.log10(i)-1)-1;
        		temp = Integer.toString(i);
        		break;
        	}
        }
        
        if(check)
        	System.out.println(temp.charAt(a));
        else
        	System.out.println("-1");
	}
}

 

 

성공 코드 : 첫번째부터 마지막 수까지 계속하면 메모리초과, 런타임이 뜬다.

               수를 줄이기 위해서 첫번째 while 문에서 9,99,999안에 k가 있는지 판단하면서 length와 처음 입력한

               k의 자리 수 보다 적은 9*11111..꼴의 수를 가져온다.

               while 문을 빠져나온 뒤 k의 자리수 보다 적은 9*111...꼴의 수에 +1을 해줘서 자리 수를 맞춰주고,

               (k-1)/length를 더해줘서 원하는 정확한 int형의 값을 가져온다.

               만약 가지고 온 수가 N보다 높으면 입력한 수보다 높은 수를 출력하기 바랬기 때문에 -1출력

               N보다 작다면 (k-1)%length를 통해 원하는 수의 index값을 가져와서 출력해준다.

               어렵다..

 

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

public class Main {
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
		
        int N = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());
        
		long finalNumber = 0;
		long length = 1;
		long numberOfDigits = 9;

		while (k > length * numberOfDigits) {
			k -= (length * numberOfDigits);
			finalNumber += numberOfDigits;
			
			length++;
			numberOfDigits *=10;
		}
				
		finalNumber = (finalNumber+1)+ (k-1)/length;
		if(finalNumber > N) {
			System.out.println(-1);
		}else {
			int index = (int) ((k-1)%length);
			System.out.println(String.valueOf(finalNumber).charAt(index));
		}
		
        
	}
}

 


 

  • 코드

1. 처음 if(arr[1][i]==1) 조건문에서 상근이의 친구를 찾는다.

2. 친구를 찾은 다음 상근이의 친구를 찾기위해서 if 문안에서 for문을 이용해서 찾는다.

결과는 맞았습니다!!

 

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

public class Main {
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
        int N = Integer.parseInt(br.readLine());
        int M = Integer.parseInt(br.readLine());
        int [][]friend = new int[N+1][N+1];
		boolean []check = new boolean[N+1];
		int count = 0;

		for(int i=0; i<M; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			int a = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());
			friend[a][b] = friend[b][a] = 1;	
		}

		for(int i=2; i<=N; i++) {
			if(friend[1][i] == 1) {	 
				if(!check[i]) {		 
					count ++;		 
					check[i] = true; 
				}

				
				for(int j=2; j<=N; j++) {
					if(friend[i][j] == 1 && !check[j]) {
						count ++;			
						check[j] = true;	
					}
				}
			}
		}

		System.out.println(count);
	}
}

 


 

  •  코드

초기 코드 1 : 각 숫자의 자리수를 Math.log10(i)+1를 통해 구한다. 결과는 시간초과

 

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

public class Main {
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int count = 0;
        
        for(int i=1;i<=N;i++) 
        	count += Math.log10(i)+1;
        
        System.out.println(count);  
	}
}

 

 

초기 코드 2 :  String으로 반복문이 돌때마다 +i를 해준 뒤 string의 길이를 length()로 출력해보았다.

                  결과는 메모리초과

 

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

public class Main {
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        String count = "";
        
        for(int i=1;i<=N;i++) 
        	count += i;
        
        System.out.println(count.length());  
	}
}

 

  • 맞은 코드

일단 i의 수 120을 입력했다는 가정으로 보면

1의 자리이상 120개 + 2의 자리이상 120-9(1의 자리)개 + 3의 자리이상 120-9-90(2의 자리)개로 더 해주는 방식으로 풀었다.

결과는 맞았습니다!!

 

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

public class Main {
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int count = 0;
        
        for(int i=1;i<=N;i*=10) 
        	count += N - (i-1);
        
        System.out.println(count);  
	}
}

 

 

- 코드

   - 많은 경우의 수를 고려했을 때 해결책은 평론가 수 - (소시지 수와 평론가 수의 최대공약수)로 나왔다. 

   - 최대공약수를 구하는 것을 재귀로 하려고하다가 재귀로하면 시간이 오래 걸린다는 말을 들어서 반복문으로 해결했다.

 

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

public class Main {
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		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 cutting = 0;

    	while (true) {
    		n = n % m;
    		
    		if (n == 0)
    			break;
    		if (m%n == 0)
    		{
    			cutting += (m / n - 1)*n;
    			break;
    		}
    		else {
    			cutting += (m / n)*n;
    			m = m % n;
    		}
    	}
    	
    	System.out.println(cutting);
	}
}

 

- 코드

   - 소수를 구하는 알고리즘인 제곱근을 사용하여서 시간을 줄였다.

 

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

public class Algorithm {
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int n = Integer.parseInt(br.readLine());
                
        while(n!=0) {
			int count = 0;			
			
			for(int i = n + 1; i <= n * 2; i++) {
				boolean flag = false;
				for(int j = 2; j < (int)Math.sqrt(i) + 1; j++) {
					if(i % j == 0) {
						flag = true;
						break;
					}
				}
				if(!flag) count++;
			}
			
			System.out.println(count);
			n = Integer.parseInt(br.readLine());
		}
		
	}
}

+ Recent posts