잡다한 배똥월드

728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? O

 

 

10799번: 쇠막대기

여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저

www.acmicpc.net

 

 

 

 

 

import java.io.*;
import java.util.*;
public class Main {
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		//괄호 줄 입력 받아서 char 배열로 변환
		//String 배열을 쓰지 않은 이유는 '('냐 ')'냐 비교할 때 
		char[] pipe = br.readLine().toCharArray();
		//괄호 문제여서 그냥 스택을 썼지만 그냥 int 써도 괜찮음
		Stack<Character> s = new Stack<>();
		//result는 쇠파이프 조각 개수
		int result = 0;
		for (int i = 0; i < pipe.length-1; i++) {
			만약 pipe[i]가 열린 괄호이고,
			if (pipe[i] == '(') {
				//만약 pipe[i+1]이 닫힌 괄호면
				if (pipe[i+1] == ')') {
					자르는 타이밍이기 때문에 스택의 개수 더해주고 i+1은 체크할 필요 없어서 i++
					result += s.size();
					i++;
				} else { //닫힌 괄호가 아니면 파이프의 시작 부분이기 때문에 스택에 추가
					s.add('(');
				}
			} else { //닫힌 괄호면 스택에서 하나 빼주고 개수 하나 더해줘야 함
				s.pop();
				result++;
			}
		}
		//마지막 문자열은 체크하지 않기 때문에 1 더해줘야함
		System.out.println(result+1);
	}
}

 

 

문제 결과 메모리 시간 코드 길이
10799 맞았습니다!! 16440 KB 176 ms 555 B

 

 

 

 

 

 

728x90
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? O

 

 

10773번: 제로

첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000) 이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 "0" 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경

www.acmicpc.net

 

 

 

 

 

import java.io.*;
import java.util.*;
public 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;
	
		//스택으로 가장 최근 입력 받은 숫자 파악하기 
		Stack<Integer> s = new Stack<>();
		
		for (int i = 0; i < n; i++) {
			int num = Integer.parseInt(br.readLine());
			//만약 num이 0이면 스택 최상위 숫자 제거
			if (num == 0) {
				s.pop();
			} else { //0이 아니면 스택에 추가
				s.add(num);
			}
		}
		//스택의 숫자를 하나씩 꺼내면서 result에 더해주기
		while (!s.isEmpty()) {
			result += s.pop();
		}
		
		System.out.println(result);
	}
}

 

문제 결과 메모리 시간 코드 길이
10773 맞았습니다!! 24032 KB 244 ms 539 B

 

 

 

 

 

 

728x90
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? O

 

 

4949번: 균형잡힌 세상

하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호("( )") 대괄호("[ ]")등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다. 각 줄은 마침표(".")로 끝난다

www.acmicpc.net

 

 

 

 

 

import java.io.*;
import java.util.*;
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 s = "";

		//br로 한 줄씩 입력 받는 것을 s에 넣고, 문장이 담긴 s가 .이 아닐 때까지 반복
		while (!(s = br.readLine()).equals(".")) {
			//s를 char 배열로 변환 => String 배열로 변환해도 되지만 시간을 단축시키려면 char을 활용하는 편이 좋음
			char[] arr = s.toCharArray();
			//여는 괄호를 담을 스택. 닫는 괄호가 나올 때 제일 위에 있는 괄호를 꺼내는 용도
			Stack<Character> stack = new Stack<>();
			//균형이 맞는지 파악용
			boolean check = true;
			
			for (int i = 0; i < arr.length; i++) {
				//만약 여는 괄호면 그냥 stack에 담기
				if (arr[i] == '(' || arr[i] == '[') stack.add(arr[i]);
				
				//만약 닫는 괄호라면
				if (arr[i] == ')' || arr[i] == ']') {
					//스택이 비어있지 않고, 닫는 소괄호면 스택 최상위가 여는 소괄호이거나 닫는 대괄호면 스택 최상위가 여는 대괄호라면
					if (!stack.isEmpty() && ((arr[i] == ')' && stack.peek() =='(') || (arr[i] == ']' && stack.peek() =='['))) {
						//스택 최상위 값 제거
						stack.pop();
					} else {
						//그렇지 않으면 균형이 맞지 않으므로 check에는 false를 담고 for문 끝내기
						check = false;
						break;
					}
				}
			}
			//마지막 확인으로 스택이 비어있지 않으면 균형이 맞지 않기 때문에 확인
			if (!stack.isEmpty()) check = false;
			//check가 true면 yes를, false면 no를 출력
			bw.write((check ? "yes" : "no") + "\n");
		}
		
		bw.flush();
		bw.close();
	}
}

 

문제 결과 메모리 시간 코드 길이
4949 맞았습니다!! 19916 KB 240 ms 919 B

 

 

 

 

 

 

728x90
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? O

 

 

4948번: 베르트랑 공준

베르트랑 공준은 임의의 자연수 n에 대하여, n보다 크고, 2n보다 작거나 같은 소수는 적어도 하나 존재한다는 내용을 담고 있다. 이 명제는 조제프 베르트랑이 1845년에 추측했고, 파프누티 체비쇼

www.acmicpc.net

 

 

 

 

 

import java.io.*;
import java.util.*;
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 num;

		//시간복잡도를 잡기 위해서 이미 확인한 숫자들은 소수인지 아닌지 boolean으로 구분하며 해시맵에 담아둠
		HashMap<Integer, Boolean> map = new HashMap<>();
		
		//숫자를 받아오면서 바로 num에 담고, 담은 숫자가 0일 때까지 반복
		while ((num = Integer.parseInt(br.readLine())) != 0) {

			//출력용 숫자를 모을 변수
			int result = 0;
			
			//임의의 자연수 n보다 크고, 2n보다 작거나 같아야 하기 때문에 범위는 n+1 ~ 2n까지임
			for (int i = num + 1; i <= 2 * num; i++) {
				//만약 map에 숫자가 없으면
				if (map.getOrDefault(i, null) == null) {
				  //소수인지 파악하기
					boolean check = true;
					for (int j = 2; j <= Math.sqrt(i); j++) {
						if (i % j == 0) {
							check = false;
							break;
						}
					}
					//check가 true이면 소수, false이면 소수가 아닌 숫자
				  //그대로 map에 넣고, result 값도 추가
					map.put(i, check);
					result += check ? 1 : 0;
				} else { //만약 map에 있으면 map의 boolean에 따라 result 값 추가
					result += map.get(i) ? 1 : 0;
				}
			}		
			bw.write(result + "\n");
		}
		
		bw.flush();
		bw.close();
	}
}

 

문제 결과 메모리 시간 코드 길이
4948 맞았습니다!! 218672 KB 648 ms 835 B

 

 

 

 

 

 

728x90
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? O

 

 

4673번: 셀프 넘버

셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,

www.acmicpc.net

 

 

 

 

 

 

import java.io.*;
public class Main {
	public static void main(String[] args) throws IOException{
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
        //체크용 boolean 배열
		boolean[] list = new boolean[10001];
		
        //1부터 10000까지 d() 함수로 보내고 체크하기
		for (int i = 1; i <= 10000; i++) {
			int num = d(i); //d함수 리턴값 : 정수
            
            //만약 리턴값이 10000보다 작고, 만들어진 적 없는 숫자라면 true로 체크하기
			if (num <= 10000 && !list[num]) list[num] = true;
		}
		
        //1부터 10000까지 방문 기록이 없는 숫자는 출력하기
		for (int i = 1; i < list.length; i++) {
			if (!list[i]) bw.write(i + "\n");
		}
		
		bw.flush();
		bw.close();
	}
	
	public static int d(int num) {
		int result = num;
		while (num > 0) {
			result += (num % 10);
			num /= 10;
		}
		return result;
	}
}

 

문제 결과 메모리 시간 코드 길이
4673 맞았습니다!! 14484 KB 144 ms 592 B

 

 

 

 

 

 

728x90
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? O

 

 

1110번: 더하기 사이클

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음,

www.acmicpc.net

 

 

 

 

 

 

import java.io.*;
public 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 first = n / 10;
		//오른쪽 숫자
        int second = n % 10;
		
        //리턴할 횟수
		int result = 0;
        
        //while문은 계속 반복하다가 조건에 맞으면 탈출할 수 있도록 true 넣기
		while (true) {
			//while문이 시작하자마자 바로 횟수 + 1
            result++;
			
            //왼쪽 숫자와 오른쪽 숫자를 더해서 새로운 숫자를 만들고
			int create = first + second;
			
            //왼쪽 숫자에는 오른쪽 숫자를 재할당
            first = second;
            //오른쪽 숫자에는 새로 만든 숫자의 1의 자리 숫자를 할당
			second = create % 10;
			
            //만약 왼쪽 숫자와 오른쪽 숫자가 처음 주어진 숫자와 동일하다면 break
			if (first == n / 10 && second == n % 10) break;
		}		
		System.out.println(result);
	}
}

 

문제 결과 메모리 시간 코드 길이
1110 맞았습니다!! 14172 KB 124 ms 493 B

 

 

 

 

 

 

728x90
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? X
본인의 실력으로 풀었는가? O

 

 

20551번: Sort 마스터 배지훈의 후계자

지훈이는 Sort 마스터다. 오랫동안 Sort 마스터 자리를 지켜온 지훈이는 이제 마스터 자리를 후계자에게 물려주려고 한다. 수많은 제자들 중에 후계자를 고르기 위해서 지훈이는 제자들에게 문제

www.acmicpc.net

 

 

 

 

 

 

import java.io.*;
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));
        
        
       	//가장 첫 번째 줄은 배열의 길이와 질문의 개수가 나옴
        //띄어쓰기로 구분되어 있기 때문에
        //읽어 들이면서 split()으로 구분
		String[] nm = br.readLine().split(" ");
		
        //첫 번째 줄 숫자로 변환
		int n = Integer.parseInt(nm[0]);
		int m = Integer.parseInt(nm[1]);
		
        //배열 a 선언
		int[] a = new int[n];
        
        //입력 순서대로 정수로 변환하면서 배열 채우기
		for (int i = 0; i < n; i++) {
			a[i] = Integer.parseInt(br.readLine());
		}
		
        //퀵 정렬 호출
		quick(a, 0, a.length-1);
		
		for (int i = 0; i < m; i++) {
			bw.write(check(Integer.parseInt(br.readLine()), a, 0, a.length-1) + "\n");
		}
		
		bw.flush();
		bw.close();
	}
	
	public static int check(int num, int[] a, int start, int end) {
		while (start+1 < end) {
			int mid = (start + end) / 2;
			
			if (a[mid] >= num) {
				end = mid;
			} else {
				start = mid;
			}
		}
		
		return a[start] == num ? start : a[end] == num ? end : -1;
	}
	
    //퀵 정렬 함수
	public static void quick(int[] a, int start, int end) {
    	//cutting 함수 호출 - 리턴값 정수
		int cut = cutting(a, start, end);
        
        
		if (start < cut-1) quick(a, start, cut-1);
		if (cut < end) quick(a, cut, end);
	}
	
	public static int cutting(int[] a, int start, int end) {
    	//중간 위치와 중간 위치의 값인 피벗 선언하기
		int mid = (start + end) / 2;
		int pivot = a[mid];
		
        //start가 end보다 작거나 같을 때까지 반복
		while (start <= end) {
        	//start위치의 값이 피벗보다 큰 경우까지 탐색
			while (a[start] < pivot) start++;
            
            //end위치의 값이 피벗보다 작은 경우까지 탐색
			while (a[end] > pivot) end--;
			
            //만약 start가 end보다 작거나 같으면 두 위치의 숫자 바꾸기
            //그리고 그 다음 위치로 각각 이동
			if (start <= end) {
				change(a, start, end);
				start++;
				end--;
			}
		}
		
		return start;
	}
	
    //두 위치 간의 숫자 바꾸는 함수
    public static void change(int[] a, int n1, int n2) {
		int temp = a[n1];
		a[n1] = a[n2];
		a[n2] = temp;
	}
}

 

문제 결과 메모리 시간 코드 길이
20551 맞았습니다!! 53696 KB 716 ms 1530 B

 

 

 

 

 

 

728x90
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? O

 

 

2439번: 별 찍기 - 2

첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제 하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.

www.acmicpc.net

 

 

 

 

 

import java.io.*;
public class Main {
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        //숫자 가져오기
		int n = Integer.parseInt(br.readLine());
		
        //1부터 n번째 줄까지 줄 기준 for문
		for (int i = 1; i <= n; i++) {
        	//줄에 맞춰서 * 작성하는 for문
			for (int j = 1; j <= n; j++) {
            	//오른쪽 정렬을 위해 만약 n-j가 i보다 작을 경우 *, 아니면 띄어쓰기 입력
                //System.out.print는 줄 바꿈 안함
				if (n-j < i) System.out.print("*"); else System.out.print(" ");
			}
            //System.out.println은 줄 바꿈
			System.out.println("");
		}
	}
}

 

 

문제 결과 메모리 시간 코드 길이
2439 맞았습니다!! 15376 KB 264 ms  395 B

 

 

 

 

 

 

728x90

+ Recent posts