잡다한 배똥월드

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

 

 

10816번: 숫자 카드 2

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net

 

 

 

 

 

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

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));
		
		//가지고 있는 숫자카드를 정리할 해시맵
		HashMap<String, Integer> map = new HashMap<>();
		
		//해시맵에 넣는 과정
		//getOrDefault는 해시맵에 키에 대한 값이 있으면 그것을 리턴하고, 아니면 default값으로 설정해놓은 값을 리턴함
		int n = Integer.parseInt(br.readLine());
		String[] nums = br.readLine().split(" ");
		for (int i = 0; i < n; i++) {
			map.put(nums[i], map.getOrDefault(nums[i], 0)+1);
		}
		
		int t = Integer.parseInt(br.readLine());
		String[] test = br.readLine().split(" ");
		for (int i = 0; i < t; i++) {
			bw.write(map.getOrDefault(test[i], 0) + " ");
		}
		
		bw.flush();
		bw.close();
	}
}

 

문제 결과 메모리 시간 코드 길이
10816 맞았습니다!! 167456 KB 1144 ms 722 B

 

 

 

 

 

 

728x90
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

 

 

9012번: 괄호

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고

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 n = Integer.parseInt(br.readLine());
		
		for (int i = 0; i < n; i++) {
			//한 줄씩 입력 받아와서 char 배열로 변환
			char[] word = br.readLine().toCharArray();
			//열린 괄호를 담기 위한 스택
			Stack<Character> s = new Stack<>();
			//for문 중간에 탈출을 했는지 체크할 boolean
			boolean value = true;
			
			for (int j = 0; j < word.length; j++) {
				if (word[j] == '(') { //만약 열린 괄호라면 스택에 추가
					s.add(word[j]);
				} else { //닫힌 괄호라면
					if (!s.isEmpty()) { //스택이 비어있지 않으면 스택에서 하나 꺼내기
						s.pop();
					} else { //비어있으면 올바른 문자열이 아니기 때문에 value 값 변경 후 탈출
						value = false;
						break;
					}
				}
			}
			//만약 s가 비어있고, value도 true면 올바른 문자열이라서 YES, 그렇지 않으면 NO 출력
			bw.write((s.isEmpty() && value ? "YES" : "NO") + "\n");
		}
		
		
		bw.flush();
		bw.close();
	}
}

 

문제 결과 메모리 시간 코드 길이
9012 맞았습니다!! 14408 KB 136 ms 778 B

 

 

 

 

 

 

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

 

 

6588번: 골드바흐의 추측

각 테스트 케이스에 대해서, n = a + b 형태로 출력한다. 이때, a와 b는 홀수 소수이다. 숫자와 연산자는 공백 하나로 구분되어져 있다. 만약, n을 만들 수 있는 방법이 여러 가지라면, b-a가 가장 큰

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));
		
		//소수인지를 담을 해시맵
		HashMap<Integer, Boolean> decimal = new HashMap<>();
		
		int num = 0;
		while ((num = Integer.parseInt(br.readLine())) != 0) {
			//소수 조합이 여러 개일 경우 차이가 큰 것을 리턴하는 것이기 때문에 작은 숫자부터 시작
			for (int i = 2; i <= num; i++) {
				//만약 i가 해시맵에 없으면 소수인지 파악 후 넣기
				if (!decimal.containsKey(i)) decimal.put(i, check(i));
				//i가 소수가 아니면 넘어가기
				if (!decimal.get(i)) continue;
				//n은 숫자에서 i를 뺀 숫자
				int n = num - i;
				//n 역시 해시맵에 없으면 소수인지 파악 후 넣기
				if (!decimal.containsKey(n)) decimal.put(n, check(n));
				//만약 n도 소수라면 bw에 입력 후 for문 종료
				if (decimal.get(n)) {
					bw.write(num + " = " + i + " + " + n + "\n");
					break;
				}
			}
		}
		
		bw.flush();
		bw.close();
	}
	//소수 파악용 함수
	public static boolean check(int num) {
		for (int i = 2; i <= Math.sqrt(num); i++) {
			if (num % i == 0) return false;
		}
		
		return true;
	}
}

 

문제 결과 메모리 시간 코드 길이
6588 맞았습니다!! 50316 KB 628 ms 915 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

 

 

10828번: 스택

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

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 t = Integer.parseInt(br.readLine());
		//스택을 구현할 ArrayList
		ArrayList<String> stack = new ArrayList<>();
		
		//명령 수 만큼 반복
		for (int i = 0; i < t; i++) {
			//push를 위해 String배열로 입력값 가져오기
			String[] code = br.readLine().split(" ");
			
			//이외에는 문제의 설명대로 push, pop, top, size, empty의 경우에 맞게 출력값 작성하기
			if (code[0].equals("push")) {
				stack.add(code[1]);
			} else {
				if (code[0].equals("pop")) {
					bw.write((stack.size() == 0 ? "-1" : stack.get(stack.size()-1)));
					if (stack.size() > 0) stack.remove(stack.size()-1);
				} else if (code[0].equals("size")) {
					bw.write(Integer.toString(stack.size()));
				} else if (code[0].equals("empty")) {
					bw.write(stack.size() == 0 ? "1" : "0");
				} else {
					bw.write((stack.size() == 0 ? "-1" : stack.get(stack.size()-1)));
				}
				bw.write("\n");
			}
		}
		bw.flush();
		bw.close();
	}
}

 

문제 결과 메모리 시간 코드 길이
10828 맞았습니다!! 19592 KB 184 ms 1006 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

+ Recent posts