알고리즘 기초 1/2 - 203

lejehwan·2022년 2월 6일
0

baekjoon

목록 보기
3/8

203 - 자료구조1(참고)


후위 표기식2 - 1935

나의 풀이

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;

public class Main {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		Stack<Double> stack = new Stack<Double>();
		char[] ch = br.readLine().toCharArray();
		Map<Character, Integer> map = new HashMap<Character, Integer>();
		char key = 'A';

		for (int i = 0; i < n; i++) {
			map.put(key, Integer.parseInt(br.readLine()));
			key++;
		}
		for (char val : ch) {
			if (Character.isAlphabetic(val)) {
				stack.push(Double.valueOf(map.get(val)));
			} else {
				double temp = cal(stack.pop(), stack.pop(), val);
				stack.push(temp);
			}
		}
		System.out.format("%.2f", stack.pop());
	}

	public static double cal(Double a, Double b, Character c) {
		if (c == '+') {
			return b + a;
		} else if (c == '-') {
			return b - a;
		} else if (c == '*') {
			return b * a;
		} else {
			return b / a;
		}
	}
}

알파벳은 스택에 push, 연산자는 스택에서 pop하는데 2개씩 꺼내와서 반대로 연산해준다. 처음에 값을 넣는 것을 2차원 배열로 했더니 추가적인 계산이 필요해서 key, value값인 map으로 수정, 소수점 포매팅하는 것도 System.out.format로 한줄로 처리 및 출력


후위 표기식 - 1918

나의 풀이

import java.io.InputStreamReader;
import java.util.Stack;
import java.io.BufferedReader;

public class Main {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		char[] ch = br.readLine().toCharArray();
		Stack<Character> stack = new Stack<Character>();
		char c = 'a';
		for (char val : ch) {
			if (Character.isAlphabetic(val)) {
				sb.append(val);
			} else if (val == '(') {
				stack.push(val);
			} else if (val == ')') {
				while (!stack.empty()) {
					if ((c = stack.pop()) == '(') {
						break;
					}
					sb.append(c);
				}
			} else {
				while (!stack.empty() && priority(stack.peek()) >= priority(val)) {
					sb.append(stack.pop());
				}
				stack.push(val);
			}
		}
		while (!stack.empty()) {
			sb.append(stack.pop());
		}
		System.out.println(sb.toString());
	}

	public static int priority(char ch) {
		if (ch == '(') {
			return 0;
		} else if (ch == '+' || ch == '-') {
			return 1;
		}
		return 2;
	}
}

'('이면 스택에 push, ')'이면 스택에서 '('를 만나기 전까지 pop, 연산자들은 우선순위를 고려해 높을 때까지 pop 하고 출력 해주고 push로 삽입
이건 나중에 다시 풀어봐야겠다.


알파벳 개수 - 10808

나의 풀이

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

public class Main {
	
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		char[] alpha = br.readLine().toCharArray();
		int[] answer = new int[26];
		for (int i = 0; i < alpha.length; i++) {
			answer[alpha[i] - 97]++;
		}
		for (int val : answer) {
			sb.append(val+ " ");
		}
		System.out.println(sb.toString().trim());
	}
}

빈도 수 구하는 알고리즘으로 해결


알파벳 찾기 - 10809

나의 풀이

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

public class Main {

	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		char[] alpha = br.readLine().toCharArray();
		int[] answer = new int[26];
		int[] location = new int[26];
		for (int i = 0; i < answer.length; i++) {
			answer[i] = -1;
		}
		for (int i = 0; i < alpha.length; i++) {
			int input = alpha[i] - 97;
			if (answer[input] != -1) {
				answer[input] = location[input];
			}else {
				answer[input] = i;
				location[input] = i;	
			}
		}
		for (int val : answer) {
			sb.append(val + " ");
		}
		System.out.println(sb.toString().trim());
	}
}

다른 사람들의 풀이를 보던 중 엄청난 방법을 봤다
-> indexOf() 사용한 풀이


문자열 분석 - 10820

나의 풀이

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

public class Main {

	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		String temp = "";
		while ((temp = br.readLine()) != null) {
			int[] answer = new int[4];
			char[] str = temp.toCharArray();
			for (int i = 0; i < str.length; i++) {
				if (str[i] >= 65 && str[i] <= 90) {
					answer[1] ++;
				}else if (str[i] >= 97 && str[i] <= 122) {
					answer[0] ++;
				}else if (str[i] >= 48 && str[i] <= 57) {
					answer[2] ++;
				}else if (str[i] == 32) {
					answer[3] ++;
				}
			}
			sb.append(answer[0] + " " + answer[1] + " " + answer[2] + " " + answer[3] + "\n");
		}
		System.out.println(sb.toString());
	}
}

아스키코드로 해결


단어 길이 재기 - 2743

나의 풀이

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

public class Main {

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

흠...


ROT13 - 11655

나의 풀이

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

public class Main {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		char[] str = br.readLine().toCharArray();
		for (int i = 0; i < str.length; i++) {
			if (str[i] >= 65 && str[i] <= 90) {
				if (str[i] >= 78) {
					sb.append((char)(str[i] - 13));
				} else {
					sb.append((char)(13 + str[i]));
				}
			} else if (str[i] >= 97 && str[i] <= 122) {
				if (str[i] >= 110) {
					sb.append((char)(str[i] - 13));
				} else {
					sb.append((char)(13 + str[i]));
				}
			}else {
				sb.append(str[i]);
			}
		}
		System.out.println(sb.toString());
	}
}

더하기, 빼기


네 수 - 10824

나의 풀이

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

public class Main {

	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] str = br.readLine().split(" ");
		long num1 = Long.parseLong((str[0] + str[1]));
		long num2 = Long.parseLong((str[2] + str[3]));
		System.out.println(num1 + num2);
	}
}

int의 범위를 넘어감 -> long


접미사 배열 - 11656

나의 풀이

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

public class Main {

	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str = br.readLine();
		String[] post = new String[str.length()];
		for (int i = 0; i < str.length(); i++) {
			post[i] = str.substring(i, str.length());
		}
		Arrays.sort(post);
		for (String val : post) {
			System.out.println(val);
		}
	}
}

Arrays.sort()로 정렬 해결


3일에 걸친 자료구조 1 풀이 끄읕

profile
hello world:)

0개의 댓글