๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค[Java] - (Level2)์Šคํ‚ฌํŠธ๋ฆฌ

by ์ฃผ๋ฐœ2 2020. 3. 19.
๋ฐ˜์‘ํ˜•

https://programmers.co.kr/learn/courses/30/lessons/49993

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

์ฝ”๋“œ

class Solution {
	public static int solution(String skill, String[] skill_trees) {
		int answer = 0;
		for(int i=0; i<skill_trees.length; i++){
			int index = 0;
			boolean check = true;

			String[] skills = skill_trees[i].split("");
			for(String s : skills){
				// skill์™€ ๊ด€๋ จ์—†๋Š” ๋ฌธ์ž๋Š” ๊ฑด๋„ˆ๋›ฐ๊ธฐ
				if(skill.indexOf(s) == -1)	continue;
				// ์Šคํ‚ฌ ๋ชฉ๋ก๊ณผ ํ˜„์žฌ ๋ฐฐ์›Œ์•ผ ํ•˜๋Š” ์Šคํ‚ฌ์˜ ์ˆœ์„œ๋ฅผ ๋น„๊ตํ•œ๋‹ค.
				if(index == skill.indexOf(s)) index ++;
					
				/*
				 * ๋ฐฐ์›Œ์•ผํ•˜๋Š” ์Šคํ‚ฌ์˜ ์ˆœ์„œ๋ณด๋‹ค ํ˜„์žฌ ์Šคํ‚ฌ์ด ๋” ์•ž์„œ๋‚˜๊ฐˆ๋•Œ.
				 * e.g) skill = "CBD" , skills = "BACDE" -> C๋ฅผ๋ฐฐ์šฐ๊ณ  B๋ฅผ ๋ฐฐ์›Œ์•ผํ•จ
				 */
				else if(index < skill.indexOf(s)){
					check = false;
					break;
				}
			}
			if(check)	answer ++;
		}
		return answer;
	}
}

ํ’€์ด

์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•˜์ง€ ์ƒ๊ฐํ•˜๋‹ค๊ฐ€ ๋„์ €ํžˆ ๋– ์˜ค๋ฅด์ง€ ์•Š์•„ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค.

๋‚˜๋Š” ๊ณ„์† ๋ฌธ์ œ๋ฅผ ์ž˜๋ชป ์ดํ•ดํ•˜๊ณ , ์ž˜๋ชป ์ƒ๊ฐํ–ˆ๋‹ค.

๋ฐฐ์›Œ์•ผํ•˜๋Š” ์Šคํ‚ฌ ์ˆœ์„œ๊ฐ€ "CBD"์ผ๋•Œ, CBD, CB, BD, CD ๋“ฑ์˜ ๊ฒฝ์šฐ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ค„ ์•Œ์•˜๋‹ค.

ํ•˜์ง€๋งŒ B๋ฅผ ๋ฐฐ์šฐ๋ ค๋ฉด C๋ฅผ ๋ฐฐ์›Œ์•ผํ•˜๊ณ , D๋ฅผ ๋ฐฐ์šฐ๋ ค๋ฉด CB๋ฅผ ๋ฐฐ์›Œ์•ผํ•˜๋ฏ€๋กœ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” CBD, CB, C ๋ฟ์ด๋‹ค.

์œ„ ํ’€์ด๋Š” ์ฃผ์–ด์ง„ skill_trees ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๋ณ„๋กœ ๋ฐฐ์›Œ์•ผํ•˜๋Š” ์Šคํ‚ฌ๊ณผ ์ˆœ์„œ๋ฅผ ๋น„๊ตํ•˜๋ฉด์„œ ํ‘ธ๋Š” ๋ฐฉ์‹์ด๋‹ค.

String.indexOf(String str) ๋ฉ”์†Œ๋“œ์˜ ๊ฒฝ์šฐ, ํ•ด๋‹น ๋ฌธ์ž์—ด์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ฌธ์ž๊ฐ€ ๋ช‡๋ฒˆ์งธ ์ธ๋ฑ์Šค์ธ์ง€ ์ฐพ๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.

๋งŒ์•ฝ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ž๊ฐ€ ์—†์„๊ฒฝ์šฐ -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

https://docs.oracle.com/javase/8/docs/api/

 

skill_trees์˜ ๊ฐ ์š”์†Œ๋ฅผ split์„ ๊ธฐ์ค€์œผ๋กœ ์ž˜๋ผ์„œ ๋ฌธ์ž๋ณ„๋กœ ๋น„๊ตํ•œ๋‹ค.

e.g) "BACDE" = > 'B', 'A', 'C', 'D', 'E'

String[] skills = skill_trees[i].split("");

 

๊ทธ ํ›„ ์ž๋ฅธ ๋ฌธ์ž์—ด์„ ๋ชจ๋‘ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ๋ฐฐ์›Œ์•ผํ•˜๋Š” ์Šคํ‚ฌ๊ณผ ๋น„๊ตํ•œ๋‹ค.

1) ํ˜„์žฌ ๋ฌธ์ž๊ฐ€ ๋ฐฐ์›Œ์•ผํ•˜๋Š” ์Šคํ‚ฌ๊ณผ ๊ด€๋ จ์ด ์—†๋Š”๊ฒฝ์šฐ(indexOf๊ฐ€ -1์„ ๋ฆฌํ„ดํ•˜๋Š”๊ฒฝ์šฐ) -> ๊ฑด๋„ˆ๋ˆ๋‹ค.

 

2) ์Šคํ‚ฌ์„ ๋ฐฐ์šฐ๊ธฐ ์œ„ํ•ด์„  ๋ฐ˜๋“œ์‹œ ์ฒซ๋ฒˆ์งธ(C, ์ธ๋ฑ์Šค = 0) ์Šคํ‚ฌ์„ ๋ฐฐ์›Œ์•ผ ํ•œ๋‹ค. 

๋”ฐ๋ผ์„œ ํ•ด๋‹น ์Šคํ‚ฌ์„ ๋ฐฐ์› ์„๊ฒฝ์šฐ, index๊ฐ’์„ ์ฆ๊ฐ€์‹œ์ผœ ๋‹ค์Œ ๋ฐฐ์›Œ์•ผํ•˜๋Š” ์Šคํ‚ฌ๊ณผ ๋น„๊ตํ•œ๋‹ค.

 

3) ํ˜„์žฌ ๋ฐฐ์›Œ์•ผํ•˜๋Š” ์Šคํ‚ฌ๋ณด๋‹ค ํ˜„์žฌ ์Šคํ‚ฌ์ด ๋” ์•ž์„ค๋•Œ.

e.g) ํ˜„์žฌ C(์ธ๋ฑ์Šค = 0)์Šคํ‚ฌ์„ ๋ฐฐ์›Œ์•ผํ•˜๋Š”๋ฐ, ํ˜„์žฌ ์Šคํ‚ฌ์ด B(์ธ๋ฑ์Šค = 1) ๋˜๋Š” D(์ธ๋ฑ์Šค = 2)์ผ๋•Œ,

๋ถˆ๊ฐ€๋Šฅํ•œ ์Šคํ‚ฌํŠธ๋ฆฌ ์ด๋ฏ€๋กœ ๋’ค๋Š” ๋” ํƒ์ƒ‰ํ•  ํ•„์š”๋„ ์—†์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์Šคํ‚ฌ์ด๋‹ค.

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€