๋ฌธ์ ๋งํฌ: https://www.acmicpc.net/problem/5052
ํ์ด
์ ๋ ฌ๊ณผ ํธ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ํ ์ ์๋ ๋ฌธ์ ์๋ค. ํ์ด๋ฅผ ์ฐพ์๋ณด๋ ํจ์ฌ ์ผ์ค์๋ ๋ฐฉ๋ฒ์ผ๋ก ํผ ๋ถ๋ค๋ ๋ง์๋ค.
(1) ์ ํ๋ฒํธ ์ ๋ ฌํ๊ธฐ
N = Integer.parseInt(br.readLine());
String[] phoneNumbers = new String[N];
for (int i=0; i<N; i++) {
phoneNumbers[i] = br.readLine();
}
Arrays.sort(phoneNumbers);
๊ธธ์ด๊ฐ ์งง์ ๋ฌธ์์ด์ด ์์ ์์ผ ํ๊ธฐ ๋๋ฌธ์ ์
๋ ฅ๋ฐ์ ์ ํ๋ฒํธ๋ฅผ ์ ๋ ฌํด์ฃผ์๋ค. 911
๊ณผ 91125426
์ด ์์ผ๋ฉด, 911
์ ๋จผ์ ์ฒดํฌํด์ผ 91125426
์ด 911
์ ํฌํจํ๊ณ ์๋ค๋ ๊ฒ์ ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
(2) ํธ๋ฆฌ ๊ตฌ์ฑํ๊ธฐ
์ ๋์ด ๊ฒ์ฌ๋ ๊ฒฐ๊ตญ ๊ฐ ๋ฌธ์๋ฅผ ๋น๊ตํด๊ฐ๋ฉฐ ์ด์ ์ ์ฌ๊ธฐ์ ๋๋ ๋ฌธ์์ด์ด ์์๋์ง๋ฅผ ์ฒดํฌํด์ผ ํ๋ค.
๊ทธ๋ฌ์ ํธ๋ฆฌ๊ฐ ์๊ฐ๋ฌ๊ณ , ์๋์ ๊ฐ์ ์์ด๋์ด๋ฅผ ์ป์ ์ ์์๋ค.
๊ฐ์ฅ ๋จผ์ 911์ ํธ๋ฆฌ์ ๋ฃ์ด๋ ์ํ๋ค. cnt
๋ ํด๋น ๋
ธ๋์์ ๋๋๋ ๋ฌธ์์ด์ ๊ฐ์์ด๋ค.
์ด ์ํ์์ 91125426
์ ์ฒดํฌํ๋ค๊ณ ์๊ฐํด๋ณด์.
๊ฐ์ฅ ๋จผ์ ์ฒซ๋ฒ์งธ ๋ฌธ์ 9
์ด๋ค. cnt==0
์ด๋ฏ๋ก ์
๋ ฅ๋ฐ์ ์ ํ๋ฒํธ ์ค์ 9
๋ ์๋ค๋ ์ฌ์ค์ ์ ์ ์๋ค.
๊ทธ ๋ค์์ ๋๋ฒ์งธ ๋ฌธ์ 1
์ด๋ค. ์ฌ์ ํ cnt==0
์ด๋ฏ๋ก ์
๋ ฅ๋ฐ์ ์ ํ๋ฒํธ ์ค์ 91
์ด ์๋ค๋ ์ฌ์ค์ ์ ์ ์๋ค.
์ธ ๋ฒ์งธ ๋ฌธ์ 1
์ ๊ฒ์ฌํ๋ฉด, cnt==1
์ด๋ค. ์ด์ ์ ์
๋ ฅ๋ฐ์ ๋ฌธ์์ด ์ค 911
์ด ์๋ค๋ ์๋ฏธ๋ค.
๋ฐ๋ผ์ ์ด ์ ํ๋ฒํธ๋ถ๋ ์ผ๊ด์ฑ ์๋ ์ ํ๋ฒํธ๋ถ๊ฐ ์๋๋ฏ๋ก, NO
๋ฅผ ์ถ๋ ฅํ๊ณ ๋ค์ ํ
์คํธ์ผ์ด์ค๋ก ๋์ด๊ฐ๋ค.
๋๋ต์ ์ธ ๋ฐ๊ทธ๋ฆผ์ ๊ทธ๋ ธ์ผ๋, ์ฝ๋๋ก ๊ตฌํํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
๋จผ์ ๋
ธ๋ ๊ฐ์ฒด์ ๋ฃ์ ํ๋๊ฐ์ ์๊ฐํด๋ณด์๋ค.
cnt
: intํ. ํ์ฌ ๋ ธ๋์์ ๋๋๋ ๋ฌธ์์ด์ด ์๋์ง๋ฅผ ์๋ฏธNode[] child
: ํฌ๊ธฐ 10์ง๋ฆฌ Nodeํ ๋ฐฐ์ด. ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ ๋ค์์ ์ค๋ ๋ฌธ์๋ฅผ ์๋ฏธํ๋ค.
(์ง๊ธ๋ณด๋ cnt
๋์ isEnd
๋ผ๋ ์ด๋ฆ์ booleanํ ํ๋๋ก ๋๋๊ฒ ๋ ๋์ ๊ฒ ๊ฐ๋ค.)
1. ํ์ฌ ๋ ธ๋์
cnt
๊ฐ์ด ์์์ด๋ฉด ์ด์ ์ ์ฌ๊ธฐ์ ๋๋ ๋ฌธ์์ด์ด ์๋ค๋ ์๋ฏธ
-> NO๋ฅผ ์ถ๋ ฅํ๊ณ ๋ค์ ํ ์คํธ์ผ์ด์ค๋ก ๋์ด๊ฐ2. ๋ค์ ๋ฌธ์๋ฅผ ๊ฒ์ฌ. ๋ค์ ๋ฌธ์๊ฐ n์ด๋ฉด ๋ค์ ๋ ธ๋๋ child[n]์ด ๋จ
3. ๋ง์ฝ child[n]์ด null๋ฉด ์ ์ธ์คํด์ค ํ ๋นํด์ฃผ๊ธฐ
4. ๋ค์ ๋ ธ๋๋ก ์ด๋
5. ๋ค์ ๋ฌธ์๊ฐ ์๋ค๋ฉด, ํ์ฌ ๋ ธ๋์ cnt๋ฅผ 1 ์ฆ๊ฐ์ํค๊ธฐ
์์ ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์ฝ๋๋ก ์ฎ๊ธฐ๋ฉด ์ด๋ ๊ฒ ๋๋ค.
boolean result = true;
for (int i=0; i<N; i++) {
result = isConsistentPhoneNumber(phoneNumbers[i]);
if(!result) break;
}
if(result) sb.append("YES\n");
else sb.append("NO\n");
static boolean isConsistentPhoneNumber(String numbers) {
Node now = root;
for (int i=0; i<numbers.length(); i++) {
if(now.cnt!=0) return false;
int n = numbers.charAt(i) - '0';
if(now.child[n]==null) {
now.child[n] = new Node();
}
now = now.child[n];
}
now.cnt++;
return true;
}
๋ฉ์๋๋ง ์ข ๋ฃํ๋๊ฒ ์๋๋ผ N๊ฐ์ ์ ํ๋ฒํธ๋ถ๋ฅผ ๊ฒ์ฌํ๋ ๋ฐ๋ณต๋ฌธ๊น์ง ํจ๊ป ํ์ถํด์ผ ํ๋ค.
๋ฐ๋ณต๋ฌธ์ด ๋๋๋ฉด ๊ฒฐ๊ณผ์ ๋ฐ๋ผ YES
๋ NO
๋ฅผ ์ถ๋ ฅํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฉ์๋๊ฐ boolean
๊ฐ์ ๋ฐํํ๋๋ก ์ค๊ณํ๋ค.
์ ์ฒด ์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
class Node {
int cnt;
Node[] child;
public Node() {
this.cnt = 0;
this.child = new Node[10];
}
}
public class Main_5052_์ ํ๋ฒํธ๋ชฉ๋ก {
static int T, N;
static Node root;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
T = Integer.parseInt(br.readLine());
while(T>0) {
root = new Node();
N = Integer.parseInt(br.readLine());
String[] phoneNumbers = new String[N];
for (int i=0; i<N; i++) {
phoneNumbers[i] = br.readLine();
}
Arrays.sort(phoneNumbers);
boolean result = true;
for (int i=0; i<N; i++) {
result = isConsistentPhoneNumber(phoneNumbers[i]);
if(!result) break;
}
if(result) sb.append("YES\n");
else sb.append("NO\n");
T--;
}
System.out.println(sb.toString());
}
static boolean isConsistentPhoneNumber(String numbers) {
Node now = root;
for (int i=0; i<numbers.length(); i++) {
if(now.cnt!=0) return false;
int n = numbers.charAt(i) - '0';
if(now.child[n]==null) {
now.child[n] = new Node();
}
now = now.child[n];
}
now.cnt++;
return true;
}
}
'๐๐ฅ๐ ๐จ๐ซ๐ข๐ญ๐ก๐ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] ํ ๋ณํฉ (0) | 2023.09.10 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] ์๊ณผ ๋๋ (0) | 2023.09.07 |
[ํ๋ก๊ทธ๋๋จธ์ค] ์์ด์ปจ (0) | 2023.09.04 |
[ํ๋ก๊ทธ๋๋จธ์ค] ์ฝ๋ฉ ํ ์คํธ ๊ณต๋ถ (0) | 2023.08.31 |
[๋ฐฑ์ค 10942] ํฐ๋ฆฐ๋๋กฌ? (0) | 2023.08.31 |