[백준] 2857. FBI
문제 링크
풀이 과정
정규식을 활용해 자바와 자바스크립트 두 언어로 문제를 풀었습니다.
Matcher 클래스의 matches 와 find 메소드의 차이점은 다음과 같습니다.
matches
는 입력 받은 문자열이 주어진 Pattern 과 전부 매치되면 true 를 리턴합니다.find
는 입력 문자열이 주어진 Pattern 과 일치되는 부분 문자열이 있으면 true 를 리턴합니다.
Pattern pattern = Pattern.compile("FBI");
Matcher matcher = pattern.matcher("47-FBI");
System.out.println(matcher.matches()); // false
System.out.println(matcher.find()); // true
예를 들어, 패턴이 “FBI” 이고, 검색 하려는 문자열이 “47-FBI” 인 경우를 보겠습니다.
matches 메소드
를 호출할 시, 입력 문자열 “47-FBI” 는 패턴 문자열 “FBI” 와 전부 일치하지 않으므로 false 를 리턴합니다.- 반면,
find 메소드
를 호출할 시, 입력 문자열 “47-FBI” 에서 패턴 문자열 “FBI”와 일치하는 부분 문자열 “FBI”가 존재하므로 true 를 리턴합니다.
Pattern pattern = Pattern.compile(".*FBI*.");
Matcher matcher = pattern.matcher("47-FBI");
System.out.println(matcher.matches()); // true
반면, 패턴을 “.FBI.” 로 설정하고 matches 메소드
를 호출할 시, 전체 문자열이 패턴과 일치하기 때문에 true 를 리턴합니다.
코드
Java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder answer = new StringBuilder();
Pattern pattern = Pattern.compile("FBI");
int idx = 0;
while (idx++ < 5) {
Matcher matcher = pattern.matcher(br.readLine());
if (matcher.find()) answer.append(idx + " ");
}
System.out.println(answer.length() == 0 ? "HE GOT AWAY!" : answer);
}
}
JS
const fs = require("fs");
const stdin = (process.platform === "linux"
? fs.readFileSync("/dev/stdin").toString()
: `47-FBI
BOND-007
RF-FBI18
MARICA-13
13A-FBILL`
).split("\n");
const input = (() => {
let line = 0;
return () => stdin[line++];
})();
let idx = 0;
let answer = [];
let regex = /FBI/g;
while (idx++ < 5) {
let str = input();
if (str.search(regex) != -1) answer.push(idx);
}
console.log(answer.length == 0 ? "HE GOT AWAY!" : answer.join(" "));
댓글남기기