본문 바로가기
Algorithm

백준 5177번 <출력 형식이 잘못 되었습니다.>

by seungh2 2020. 8. 31.

백준 알고리즘 5177번

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

 

5177번: 출력 형식이 잘못되었습니다

각 테스트 케이스마다, Data Set K: 를 출력한 뒤 만일 두 문자열이 출력 형식을 감안했을 때 동일한 문자열이라면 equal을, 출력 형식을 잘 조작해도 서로 다른 문자열이라면 not equal을 출력한다. 각

www.acmicpc.net


5177번

입력으로 문자열 s1과 s2를 입력받아

출력 형식을 잘 조작해서 서로 동일한 문자열들이라면 equal을 

그렇지 않으면 not equal을 출력한다.

 

출력 형식

- 알파벳 대문자와 소문자는 구별X

- 문자열의 맨 앞 혹은 맨 뒤에 오는 공백 or

  특수 부호의 바로 앞이나 바로 뒤에 나오는 공백은 있으나 없으나 상관 없다.

- 여는 괄호끼리는 종류  구별 x 닫는 괄호끼리도 마찬가지

- 쉼표(,)와 세미콜론(;)은 구별x

- 공백이 하나 이상이라면, 공백의 크기는 관계없다. 공백의 유무 차이는 문제가 된다.


문제 해결

처음에 문자열을 입력받을 때 

여는 괄호는 (으로, 닫는 괄호는 )으로 통일시키고 ;을 ,로 바꿔주었다.

그리고 모든 문자를 소문자로 바꿔주었다.

 

이제 공백만 해결하면 된다.

공백이 여러 개 반복해서 나와도 한 개의 공백만 있어도 되기 때문에

여러 개의 공백을 한 개의 공백으로 만들어준다.

 

그리고 나서

출력 형식에서 있으나 없으나 상관없는 공백은 없애주고 나면

입력받은 문자열을 똑같은 형식으로 만들어주었기 떄문에 비교할 수 있게 된다.

 

spacel()

: 여러 개의 공백을 한 개의 공백으로 만들어주기.

  문자열을 charAt()으로 하나씩 보는데

  만약 공백이면 공백이 더 나오지 않을 때까지 for문의 index를 +1해준다.

 

special()

: 특수 부호의 앞 뒤에 있는 공백을 없애주기.

  문자열을 charAt()으로 하나씩 보면서

  문자열이 특수 부호이고 앞 문자나 뒷 문자가 공백이면 그 부분을 #으로 바꿔준다.

  (지울 때 원래 문자열의 문자를 지우지 않도록 하기 위해특수 부호 목록에 없는 문자를 사용)

  문자열을 다봤으면 replaceAll()을 이용해 #을 ""으로 바꿔준다.


코드

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());

		String[] input = new String[n * 2];

		for (int i = 0; i < n * 2; i++) {
			String str = br.readLine();
			str = str.toLowerCase();
			str = str.replaceAll("\\{", "\\(");
			str = str.replaceAll("\\[", "\\(");
			str = str.replaceAll("\\}", "\\)");
			str = str.replaceAll("\\]", "\\)");
			str = str.replaceAll(";", ",");
			str = space(str);
			str = special(str);
			input[i] = str;
		}

		int index = 1;
		for (int i = 0; i < n * 2; i = i + 2) {
			int a = input[i].compareTo(input[i + 1]);
			if (a == 0) {
				System.out.println("Data Set " + index + ": equal");
			} else {
				System.out.println("Data Set " + index + ": not equal");

			}
			System.out.println("");

			index++;
		}

	}

	private static String special(String str) {
		StringBuilder sb = new StringBuilder(str);
		int n = sb.length();
		int index = 0;
		char ch;
		for (int i = 0; i < n; i++) {
			ch = sb.charAt(i);
			if (ch == '(' || ch == ')' || ch == ',' || ch == '.' || ch == ':') {
				index = i - 1; // 특수문자 앞 공백을 #로바꾸기
				if ((0 <= index && index < n) && str.charAt(index) == ' ') {
					sb.replace(index, index + 1, "#");
				}
				index = i + 1; // 특수문자 뒤 공백을 #로 바꾸기
				if ((0 <= index && index < n) && str.charAt(index) == ' ') {
					sb.replace(index, index + 1, "#");
				}
			}

		}
		return sb.toString().replaceAll("\\#", "");
	}

	private static String space(String str) {
		StringBuffer sb = new StringBuffer();
		int length = str.length();
		char ch;
		for (int i = 0; i < length;) {
			ch = str.charAt(i);
			sb.append(ch);
			i++;
			if (ch == ' ') {
				while (i < length && str.charAt(i) == ' ') {
					i++;
				}
			}
		}
		return sb.toString();
	}

}

결과


 

728x90

'Algorithm' 카테고리의 다른 글

백준 12101번 <1, 2, 3 더하기 2>  (0) 2020.09.02
백준 12865번 <평범한 배낭>  (0) 2020.09.01
백준 10926번 <??!>  (0) 2020.08.29
백준 9095번 <1, 2, 3 더하기>  (0) 2020.08.28
백준 17413번 <단어 뒤집기 2>  (0) 2020.08.28

댓글