IT's 우

[java]백준 1541번: 잃어버린 괄호, 그리디 알고리즘, split()함수, split("+") 안돼! split("[+]") or split("\\+") 본문

알고리즘/백준

[java]백준 1541번: 잃어버린 괄호, 그리디 알고리즘, split()함수, split("+") 안돼! split("[+]") or split("\\+")

디우 2022. 9. 27. 02:22
728x90

https://www.acmicpc.net/problem/1541

 

1541번: 잃어버린 괄호

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다

www.acmicpc.net

 

 

그리디 greedy 알고리즘:

현재 상태에서 보는 선택지 중 최선의 선택지가 전체 선택지 중 최선의 선택지라고 가정하는 알고리즘

 

 

그리디 알고리즘의 핵심 이론

 해 선택: 현재 상태에서 가장 최선이라고 생각되는 해를 선택

 

 적절성 검사: 현재 선택한 해가 전체 문제의 제약 조건에 벗어나지 않는지 검사

 

 해 검사: 현재까지 선택한 해 집합이 전체 문제를 해결할 수 있는지 검사. 전체 문제를 해결하지 못한다면 ①로 돌아가 같은 과정 반복


 

내가 푼 코드와 split()을 사용한 코드

 

코드 1: 내가 푼 거 
import java.io.*;
import java.util.*;

public class j1541 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str = br.readLine();
		char[] ch = str.toCharArray();
		int sum = 0;
		boolean minus = false; // false면 + true면 -
		Queue<Integer> que = new LinkedList<>();
		for (char c : ch) {
			if (c != '-' && c != '+') {
				que.add(c - '0');
			} else {
				

				if (minus == false) {// 마이너스 만나기 전에 다 더해준다
					sum += change(que);
					que = new LinkedList<>();
				} else {// 마이너스 만나면 다 빼준다
					sum -= change(que);
					que = new LinkedList<>();
				}
				if (c == '-') {
					minus = true;
				}
				
			}

		}
		if (minus == false) {
			sum += change(que);
		} else {
			sum -= change(que);
		}

		System.out.println(sum);

	}

	static int change(Queue<Integer> q) {
		int result = 0;
		for (int i = q.size() - 1; i >= 0; i--) {
			result += q.poll() * Math.pow(10, i);
		}
		
		return result;
	}
}

 

풀이 1

1. 문장을  String str로 받아서 char [] 배열로 바꿔주고 부호를 만날 때마다 change 함수를 사용하여 숫자로 바꿔줌

-> change는 queue를 사용하여 숫자로 바꿔줌

 

2. -를 만나기 전까지 모든 수를 더해주고 -를 만난 이후로는 숫자를 모두 빼준다. 

 

 

split을 사용한 코드

 

import java.util.*;

public class j1541_2 {
	public static void main(String[] args)  {
		Scanner sc=new Scanner(System.in);
		String exam=sc.nextLine();
		// split을 사용하여 -를 기준으로 나눠준다.
		String[] str=exam.split("-");
		
		int answer=0;
		for(int i=0;i<str.length;i++) {
			int temp=Sum(str[i]);
			if(i==0) {//0은 마이너스 만나기 전이므로 다 더해준다
				answer+=temp;
			}else {//마이너스 만난 이후로는 모두 뺴준다.
				answer-=temp;
			}
		}
	System.out.println(answer);

	}

	static int Sum(String s) {
		int sum=0;
		String temp[]=s.split("[+]"); 	//	split("+")부분에서 컴파일러가 + 부분을 인식 못함 split.("+") or split.("\\+")
		for(int i=0;i<temp.length;i++) {
			sum+=Integer.parseInt(temp[i]);
		}
		return sum;
				
	}
}

 

풀이

// split을 사용하여 -를 기준으로 나눠준다.

String[] str=exam.split("-");

 

나눠준 부분은 str[0]: 1번째를 제외하곤 모두 빼준다. 첫 번째 이후에는 -를 만난 부분이므로

 

->

-로 나눠준 부분 더해주기 위해 Sum 함수 구현:

String [] temp =s.split("[+]");

나눠준 temp는 Integer.parseInt() 사용하여 숫자로 더해준다.

 

string.split("+") 부분에서 컴파일러가 + 부분을 인식하지 못한다. 그러므로 str.split("[+]") or str.split("\\+")

 

728x90
반응형