J

[JAVA] BOJ ๋ฐฑ์ค€ 5052 ์ „ํ™”๋ฒˆํ˜ธ ๋ชฉ๋ก ๋ณธ๋ฌธ

๐Ÿ”‘ Problem Solving/๐Ÿ‡ BOJ

[JAVA] BOJ ๋ฐฑ์ค€ 5052 ์ „ํ™”๋ฒˆํ˜ธ ๋ชฉ๋ก

snowball๐Ÿฐ 2023. 5. 10. 10:16

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

 

5052๋ฒˆ: ์ „ํ™”๋ฒˆํ˜ธ ๋ชฉ๋ก

์ฒซ์งธ ์ค„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ t๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ t ≤ 50) ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ฒซ์งธ ์ค„์—๋Š” ์ „ํ™”๋ฒˆํ˜ธ์˜ ์ˆ˜ n์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ n ≤ 10000) ๋‹ค์Œ n๊ฐœ์˜ ์ค„์—๋Š” ๋ชฉ๋ก์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์ „ํ™”๋ฒˆํ˜ธ๊ฐ€

www.acmicpc.net

Trie ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์˜€๋‹ค.
๐Ÿ’ก computeIfAbsent()
Map์—์„œ ํŠน์ • ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•œ ํ›„, ์—†์œผ๋ฉด ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์„œ ๋„ฃ์–ด์ฃผ๋Š” ํ˜•ํƒœ์˜ ์ฝ”๋“œ์ด๋‹ค.
Key๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” value๊ฐ€ ์กด์žฌํ•˜๋ฉด ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•˜๊ณ  ์—†์œผ๋ฉด ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํŒจํ„ด์˜ ์ฝ”๋“œ๋ฅผ ์œ„ํ•ด computeIfAbsent()๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
์ „
Value value = map.get(key);
if(value == null) {
value = getNewValue(key);
map.puy(key, value);
}
ํ›„
Value value = map.computeIfAbsent(key, k -> getNewValue(key));

 

import java.io.*;
import java.util.*;

public class boj_5052 {
	static class Node{
		Map<Character, Node> childNode = new HashMap<>();
		boolean end;
	}
	static class MakeTrie{
		Node rootNode = new Node();
		boolean insert(String phone) {
			Node node = this.rootNode;
			boolean flag = false;
			for(int p=0; p<phone.length(); p++) {
				Node temp = node.childNode.getOrDefault(phone.charAt(p), null);
				if(temp == null) flag = true;
				node = node.childNode.computeIfAbsent(phone.charAt(p), key -> new Node());
				if(node.end) return false;
			}
			node.end = true;
			return flag;
		}
	}
	
	public static void main(String[] args) throws Exception{
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int T = Integer.parseInt(bf.readLine());
		for(int t=1; t<=T; t++) {
			int N = Integer.parseInt(bf.readLine());
			boolean flag = false;
			MakeTrie trie = new MakeTrie();
			for(int i=0; i<N; i++) {
				if(!trie.insert(bf.readLine())) flag = true;
			}
			if(flag) sb.append("NO").append("\\n");
			else sb.append("YES").append("\\n");
		}
		System.out.println(sb);
	}

}

MakeTrie class๋ฅผ ์‚ดํŽด๋ณด์ž

static class MakeTrie{
	Node rootNode = new Node();
	boolean insert(String phone) {
		Node node = this.rootNode;
		boolean flag = false;
		for(int p=0; p<phone.length(); p++) {
			Node temp = node.childNode.getOrDefault(phone.charAt(p), null);
			if(temp == null) flag = true;
			node = node.childNode.computeIfAbsent(phone.charAt(p), key -> new Node());
			if(node.end) return false;
		}
		node.end = true;
		return flag;
	}
}
  1. flag ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋ฒˆํ˜ธ๊ฐ€ ๋‹ค๋ฅธ ๋ฒˆํ˜ธ์˜ ์ ‘๋‘์‚ฌ๋กœ ์กด์žฌํ•˜๋Š” ์ง€๋ฅผ ํ™•์ธํ•ด์ค€๋‹ค.
  2. for๋ฌธ์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค.
  3. ํ•ด๋‹น ๋ฒˆํ˜ธ๊ฐ€ ๋‹ค๋ฅธ ๋ฒˆํ˜ธ๋ฅผ ์ ‘๋‘์‚ฌ๋กœ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ node.end๊ฐ€ ์ค‘๊ฐ„์— true์ธ ๊ฒฝ์šฐ false๋ฅผ returnํ•ด์ค€๋‹ค.

main์„ ์‚ดํŽด๋ณด์ž

public static void main(String[] args) throws Exception{
	BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
	StringBuilder sb = new StringBuilder();
	int T = Integer.parseInt(bf.readLine());
	for(int t=1; t<=T; t++) {
		int N = Integer.parseInt(bf.readLine());
		boolean flag = false;
		MakeTrie trie = new MakeTrie();
		for(int i=0; i<N; i++) {
			if(!trie.insert(bf.readLine())) flag = true;
		}
		if(flag) sb.append("NO").append("\\n");
		else sb.append("YES").append("\\n");
	}
	System.out.println(sb);
}

flag ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด์„œ insert ์ค‘ false๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด flag๋ฅผ true๋กœ ๋ฐ”๊พผ๋‹ค.

flag๊ฐ€ true๋ฉด NO ์•„๋‹ˆ๋ฉด YES๋ฅผ ์ถœ๋ ฅ

Comments