๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/1985)
< ๋์งํธ ์น๊ตฌ >
๋ฌธ์ ํ์ด
x๋ฅผ ๊ท์น์ ๋ฐ๋ผ ๊ณ ์น ํ y์ ์ด๋ฃจ์ด์ ธ ์๋ ์ซ์๊ฐ ์ผ์นํ๋์ง ํ์ธํ๊ณ , ์ผ์นํ์ง ์๋ค๋ฉด y๋ฅผ ๊ท์น์ ๋ฐ๋ผ ๊ณ ์น ํ x์ ์ด๋ฃจ์ด์ ธ ์๋ ์ซ์๊ฐ ์ผ์นํ๋์ง ํ์ธํ๋ค.
my solution (Java)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
public class _1985_ { // ๋์งํธ ์น๊ตฌ
static Set<Integer> set1, set2;
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
for (int i = 0; i < 3; i++) {
st = new StringTokenizer(bf.readLine());
String x = st.nextToken();
String y = st.nextToken();
set1 = new HashSet<>();
set2 = new HashSet<>();
for (int j = 0; j < x.length(); j++) {
set1.add(x.charAt(j) - '0');
}
for (int j = 0; j < y.length(); j++) {
set2.add(y.charAt(j) - '0');
}
boolean flag = false;
for (int num : set1) {
if (set1.size() != set2.size() || !set2.contains(num)) {
flag = true;
break;
}
}
if (!flag) {
bw.write("friends\n");
} else {
if (change(x, true) || change(y, false)) {
bw.write("almost friends\n");
} else {
bw.write("nothing\n");
}
}
}
bw.flush();
}
private static boolean change(String num, boolean flag) {
char arr[] = num.toCharArray();
for (int i = 0; i < num.length() - 1; i++) { // + -
Set<Integer> answer = new HashSet<>();
if (arr[i] - '0' + 1 > 9 || arr[i + 1] - '0' - 1 < 0) {
continue;
}
answer.add(arr[i] - '0' + 1);
answer.add(arr[i + 1] - '0' - 1);
for (int j = 0; j < num.length(); j++) {
if (j == i || j == i + 1) {
continue;
}
answer.add(arr[j] - '0');
}
boolean check = false;
for (int x : answer) {
if (flag) {
if (answer.size() != set2.size() || !set2.contains(x)) {
check = true;
break;
}
} else {
if (answer.size() != set1.size() || !set1.contains(x)) {
check = true;
break;
}
}
}
if (!check) {
return true;
}
}
for (int i = 0; i < num.length() - 1; i++) { // - +
Set<Integer> answer = new HashSet<>();
if (arr[i] - '0' - 1 < 0 || arr[i + 1] - '0' + 1 > 9 || (i == 0 && arr[i] - '0' - 1 == 0)) {
continue;
}
answer.add(arr[i] - '0' - 1);
answer.add(arr[i + 1] - '0' + 1);
for (int j = 0; j < num.length(); j++) {
if (j == i || j == i + 1) {
continue;
}
answer.add(arr[j] - '0');
}
boolean check = false;
for (int x : answer) {
if (flag) {
if (answer.size() != set2.size() || !set2.contains(x)) {
check = true;
break;
}
} else {
if (answer.size() != set1.size() || !set1.contains(x)) {
check = true;
break;
}
}
}
if (!check) {
return true;
}
}
return false;
}
}
๋ณ์)
x, y : ๋ ์ ์
set1 , set2 : x์ y๊ฐ ์ด๋ฃจ์ด์ ธ ์๋ ์ซ์ ๊ตฌ์ฑ
flag : ์ด๋ฃจ์ด์ ธ ์๋ ์ซ์ ๊ตฌ์ฑ ์ผ์น ์ฌ๋ถ
arr : ์ ๋ ฅ๋ฐ์ ์ซ์๋ฅผ char ๋ฐฐ์ด๋ก ๋ณํ
answer : ๊ท์น์ ๋ฐ๋ผ ๋ฐ๊พผ ์ซ์๊ฐ ์ด๋ฃจ์ด์ ธ ์๋ ์ซ์ ๊ตฌ์ฑ
check : ๊ตฌ์ฑ ์ผ์น ์ฌ๋ถ
์ ์ x์ y๋ฅผ ์ ๋ ฅ๋ฐ๋๋ค. ๊ฐ x์ y๋ฅผ ๊ตฌ์ฑํ๋ ์ซ์๋ฅผ set1๊ณผ set2์ ์ ์ฅํ๋ค. set1๊ณผ set2๋ฅผ ๋น๊ตํด์ ์ผ์นํ๋ค๋ฉด "friends"๋ฅผ ์ถ๋ ฅํ๋ค. ์ผ์นํ์ง ์๋ค๋ฉด x์ y๋ฅผ ๊ท์น์ ๋ง๊ฒ ๊ณ ์น ํ ์ผ์นํ๋ค๋ฉด "almost friends"๋ฅผ ์ถ๋ ฅํ๋ค. ์ผ์นํ์ง ์๋ค๋ฉด "nothing"์ ์ถ๋ ฅํ๋ค.
change(String num, boolean flag)
num์ char ๋ฐฐ์ด๋ก ๋ฐ๊พผ๋ค. num์ ์ํํ๋ฉฐ i์ 1์ ๋ํ๊ณ i+1์ 1์ ๋บ๋ค. ์ด๋ 0๋ณด๋ค ์๊ณ 9๋ณด๋ค ํฌ๋ค๋ฉด ์ซ์ ๋ฒ์์ ๋ฒ์ด๋๋ฏ๋ก ์ข ๋ฃํ๋ค. ๋ฐ๊พผ ๊ฐ์ ๊ตฌ์ฑํ๋ ์ซ์๋ฅผ answer์ ์ ์ฅํ๋ค. x๋ฅผ ๊ท์น์ ๋ฐ๋ผ ๋ฐ๊พผ ๊ฒ์ด๋ผ๋ฉด answer๊ณผ set2๋ฅผ ๋น๊ตํ๋ค. ์ผ์นํ์ง ์๋ค๋ฉด ์ข ๋ฃํ๋ค. y๋ฅผ ๊ท์น์ ๋ฐ๋ผ ๋ฐ๊พผ ๊ฒ์ด๋ผ๋ฉด answer๊ณผ set1์ ๋น๊ตํ๋ค. ์ผ์นํ์ง ์๋ค๋ฉด ์ข ๋ฃํ๊ณ ๋ค์ ๊ท์น์ ๋ฐ๋ผ num์ ์ํํ๋ฉฐ i์ 1์ ๋นผ๊ณ i+1์ 1์ ๋ํ๋ค. ๋๋จธ์ง๋ ์์ ๊ฐ์ด ๊ตฌํํ๋ค.

'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 5766_ํ ์๋ฒ์ง๋ ์ ๋ช ํด! (1) | 2024.07.03 |
---|---|
[Baekjoon] 1913_๋ฌํฝ์ด (0) | 2024.07.02 |
[Baekjoon] 4396_์ง๋ขฐ ์ฐพ๊ธฐ (0) | 2024.06.28 |
[Baekjoon] 4108_์ง๋ขฐ์ฐพ๊ธฐ (0) | 2024.06.27 |
[Baekjoon] 2615_์ค๋ชฉ (0) | 2024.06.26 |