백준 알고리즘 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();
}
}
결과
'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 |
댓글