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

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค[Java] - (Level2)์˜์–ด ๋๋ง์ž‡๊ธฐ

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

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

 

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

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

programmers.co.kr

์ฝ”๋“œ

import java.util.*;

class Solution {
    public int[] solution(int n, String[] words) {
        int[] answer = new int[2];
        List<String> list = new ArrayList<String>();
        boolean flag = true;
        
        for(int i=0; i<words.length; i++){
            if(list.contains(words[i])){   // ์ด์ „์— ๋“ฑ์žฅํ•œ ๋‹จ์–ด์ธ๊ฒฝ์šฐ
                answer[0] = (i%n) + 1;
                answer[1] = (i/n) + 1;
                flag = false;
                break;
            }
            
            list.add(words[i]); // ํ˜„์žฌ ๋‹จ์–ด ๋ฆฌ์ŠคํŠธ์— ๋„ฃ๊ธฐ
            
            // ์ด์ „ ๋๋‹จ์–ด์™€ ํ˜„์žฌ ์ฒซ๋‹จ์–ด๊ฐ€ ๋‹ค๋ฅธ๊ฒฝ์šฐ - ๋๋ง์ž‡๊ธฐ๊ฐ€ ์•„๋‹Œ๊ฒฝ์šฐ
            if(i>0 && words[i-1].charAt(words[i-1].length()-1) != words[i].charAt(0)){
                answer[0] = (i%n) + 1;
                answer[1] = (i/n) + 1;
                flag = false;
                break;
            }
        }
        if(flag) return new int[]{0, 0};
        return answer;
    }
}

ํ’€์ด

์–ด์ œ ํ’€๋‹ค๊ฐ€ ์‹คํŒจํ•ด์„œ ๋†”๋‘๊ณ  ์˜ค๋Š˜ ๋‹ค์‹œ ํ’€์–ด๋ณด๋‹ˆ ํ•ด๊ฒฐํ–ˆ๋‹ค. 

๋ฌธ์ œ๋Š” ๊ธธ์ง€๋งŒ ์ฃผ์–ด์ง„ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ์ธ๋ฐ ๋ฌธ์ œ์˜ ์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

  1. 1๋ฒˆ๋ถ€ํ„ฐ ๋ฒˆํ˜ธ ์ˆœ์„œ๋Œ€๋กœ ํ•œ ์‚ฌ๋žŒ์”ฉ ์ฐจ๋ก€๋Œ€๋กœ ๋‹จ์–ด๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
  2. ๋งˆ์ง€๋ง‰ ์‚ฌ๋žŒ์ด ๋‹จ์–ด๋ฅผ ๋งํ•œ ๋‹ค์Œ์—๋Š” ๋‹ค์‹œ 1๋ฒˆ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  3. ์•ž์‚ฌ๋žŒ์ด ๋งํ•œ ๋‹จ์–ด์˜ ๋งˆ์ง€๋ง‰ ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋‹จ์–ด๋ฅผ ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  4. ์ด์ „์— ๋“ฑ์žฅํ–ˆ๋˜ ๋‹จ์–ด๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  5. ํ•œ ๊ธ€์ž์ธ ๋‹จ์–ด๋Š” ์ธ์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ 2, 3, 4๋ฒˆ์˜ ์กฐ๊ฑด์„ ์œ ์˜ํ•˜๋ฉฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด ๋œ๋‹ค.

 

 

โ— 3๋ฒˆ์€ ์•ž์‚ฌ๋žŒ์ด ๋งํ•œ ๋‹จ์–ด์˜ ๋งˆ์ง€๋ง‰ ๋ฌธ์ž์™€ ํ˜„์žฌ ์‚ฌ๋žŒ์ด ๋งํ•œ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ ๊ฐ™์€์ง€ ํŒ๋‹จ ํ•˜๋Š” ์กฐ๊ฑด์€ ๋‹ค์Œ์ด๋‹ค.

(๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ ๋‹จ์–ด๋Š” ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ i > 0 ์ด๋ผ๋Š” ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.)

            // ์ด์ „ ๋๋‹จ์–ด์™€ ํ˜„์žฌ ์ฒซ๋‹จ์–ด๊ฐ€ ๋‹ค๋ฅธ๊ฒฝ์šฐ - ๋๋ง์ž‡๊ธฐ๊ฐ€ ์•„๋‹Œ๊ฒฝ์šฐ
            if(i>0 && words[i-1].charAt(words[i-1].length()-1) != words[i].charAt(0)){
                answer[0] = (i%n) + 1;
                answer[1] = (i/n) + 1;
                flag = false;
                break;
            }

 

โ— 4๋ฒˆ์€ list์— ๋‹จ์–ด๋ฅผ ํ•˜๋‚˜์”ฉ ๋„ฃ๊ณ , ์ค‘๋ณต์ฒดํฌ(contains()) ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ํ™•์ธ์„ ํ•œ๋‹ค.

        for(int i=0; i<words.length; i++){
            if(list.contains(words[i])){   // ์ด์ „์— ๋“ฑ์žฅํ•œ ๋‹จ์–ด์ธ๊ฒฝ์šฐ
                answer[0] = (i%n) + 1;
                answer[1] = (i/n) + 1;
                flag = false;
                break;
            }
            
            list.add(words[i]); // ํ˜„์žฌ ๋‹จ์–ด ๋ฆฌ์ŠคํŠธ์— ๋„ฃ๊ธฐ

 

โ— ๋งŒ์•ฝ ์œ„์—์„œ ์กฐ๊ฑด 3, 4๋ฒˆ์— ์˜ํ•ด ํƒˆ๋ฝ์ž๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด flag์˜ ๊ฐ’์€ ๊ทธ๋Œ€๋กœ true์ด๋ฏ€๋กœ,

๋งˆ์ง€๋ง‰์— true์ผ๊ฒฝ์šฐ [0, 0]์„ ๋ฆฌํ„ดํ•ด์ค€๋‹ค.

        if(flag) return new int[]{0, 0};

 

๋ฆฌํ„ดํ•˜๋Š” ๊ฐ’ - [๋ฒˆํ˜ธ, ์ฐจ๋ก€] ์—์„œ ๋ฒˆํ˜ธ์™€ ์ฐจ๋ก€๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ•ด์•ผ ํ• ์ง€ ๊ณ ๋ฏผ์„ ์ข€ ํ–ˆ๋Š”๋ฐ, ์ง์ ‘ ์ฃผ์–ด์ง„ ์ž…์ถœ๋ ฅ์„ ์˜ˆ์ œ๋กœ ํ•˜๋‚˜ํ•˜๋‚˜ ์จ๊ฐ€๋ฉฐ ๊ทœ์น™์„ ์ฐพ์•„์„œ ํ•ด๊ฒฐํ–ˆ๊ณ , ๋ฒˆํ˜ธ = (i%n) + 1 , ์ฐจ๋ก€ = (i/n) + 1 ์ด๋ผ๋Š” ๊ทœ์น™์ด ์žˆ๋‹ค.

 

 

์ฒซ๋ฒˆ์งธ ์ž…์ถœ๋ ฅ ์˜ˆ์ œ๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด์„œ ๋ณด์ž. ( n = 3 , ๋‹จ์–ด = 9๊ฐœ )

3 [tank, kick, know, wheel, land, dream, mother, robot, tank] [3,3]

์œ„ ๊ทธ๋ฆผ์—์„œ ์ฒซ๋ฒˆ์งธ ์—ด๋“ค์˜ ๊ฐ’์€ i์˜๊ฐ’(์ธ๋ฑ์Šค)๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ , ๋‘๋ฒˆ์งธ๋Š” ๋ฌธ์ž, ์„ธ๋ฒˆ์งธ๊ฐ€ [๋ฒˆํ˜ธ, ์ฐจ๋ก€]์˜ ํ˜•์‹์ด๋‹ค.

๋จผ์ € ๋ฒˆํ˜ธ ๋ถ€ํ„ฐ ํ™•์ธํ•ด๋ณด์ž.

i์˜ ๊ฐ’์ด 0, 3, 6 ์ผ๋•Œ ์ฒซ๋ฒˆ์งธ ์‚ฌ๋žŒ์ด๋‹ค.

0, 3, 6 ์„ 3์œผ๋กœ ๋‚˜๋ˆด์„๊ฒฝ์šฐ ๋‚˜๋จธ์ง€๋Š” ๋ชจ๋‘ 0์ด๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์— +1์„ ํ•ด์ฃผ๋ฉด ์ฒซ๋ฒˆ์งธ ์‚ฌ๋žŒ์ด ๋œ๋‹ค.

 

i์˜ ๊ฐ’์ด 1, 4, 7 ์ผ๋•Œ ๋‘๋ฒˆ์งธ ์‚ฌ๋žŒ์ด๋‹ค.

1, 4, 7 ์„ 3์œผ๋กœ ๋‚˜๋ˆด์„๊ฒฝ์šฐ ๋‚˜๋จธ์ง€๋Š” ๋ชจ๋‘ 1์ด๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์— +1์„ ํ•ด์ฃผ๋ฉด ๋‘๋ฒˆ์งธ ์‚ฌ๋žŒ์ด ๋œ๋‹ค.

 

๋”ฐ๋ผ์„œ ๊ทœ์น™์€ answer[0] = i%n + 1 ์ด ๋œ๋‹ค.

 

 

๊ทธ ๋‹ค์Œ์œผ๋กœ ์ฐจ๋ก€๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

i์˜ ๊ฐ’์ด 0, 1, 2 ์ผ๋•Œ ์ฐจ๋ก€๋Š” 1์ด๋‹ค.

0, 1, 2๋ฅผ 3์œผ๋กœ ๋‚˜๋ˆด์„๊ฒฝ์šฐ ๋ชซ์€ 0์ด๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์— +1์„ ํ•ด์ฃผ๋ฉด ์ฒซ๋ฒˆ์งธ ์ฐจ๋ก€๊ฐ€ ๋œ๋‹ค.

 

i์˜ ๊ฐ’์ด 3, 4, 5 ์ผ๋•Œ ์ฐจ๋ก€๋Š” 2์ด๋‹ค.

3, 4, 5 ๋ฅผ 3์œผ๋กœ ๋‚˜๋ˆด์„๊ฒฝ์šฐ ๋ชซ์€ 1์ด๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์— +1์„ ํ•ด์ฃผ๋ฉด ๋‘๋ฒˆ์งธ ์ฐจ๋ก€๊ฐ€ ๋œ๋‹ค.

 

๋”ฐ๋ผ์„œ ๊ทœ์น™์€ answer[1] = i/n + 1 ์ด ๋œ๋‹ค.

 

 

 

+ ์–ด์ œ ํ’€์—ˆ๋˜ ์ฝ”๋“œ๋กœ๋„ ํ•ด๊ฒฐ์ด ๋๋‹ค.

class Solution {

	// ๋ฐฐ์—ด์— ๋‹จ์–ด๊ฐ€ ์ค‘๋ณต์ธ์ง€ ์•„๋‹Œ์ง€ ์ฒดํฌ
	public static boolean checkWords(String[] words, String s, int end){
		int count = 0;
		boolean flag = true;
		for(int i=0; i<end; i++)
			if(words[i].equals(s))
				count ++;
		// ๋ฐฐ์—ด์— ๋‹จ์–ด๊ฐ€ ํ•œ๊ฐœ ์ธ ๊ฒฝ์šฐ
		if(count == 0)  flag = true;

		// ๋ฐฐ์—ด์— ๋‹จ์–ด๊ฐ€ ๋‘๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ
		else    flag = false;
		return flag;
	}

	public static int[] solution(int n, String[] words) {
		int[] answer = new int[2];
		boolean check = true;   // ํƒˆ๋ฝ์ž๊ฐ€ ์ƒ๊ธฐ๋Š”์ง€ ์•„๋‹Œ์ง€ ์ฒดํฌ
		int end = 0;

		/* ํƒˆ๋ฝํ•˜๋Š” ๊ฒฝ์šฐ๋Š” 2๊ฐ€์ง€ -> ์ด์ „์— ๋งํ•œ ๋‹จ์–ด ๋งํ•˜๊ฑฐ๋‚˜ ๋‹จ์–ด๋ฅผ ์ž˜๋ชป ๋งํ•œ ๊ฒฝ์šฐ */
		for(int i=0; i<words.length; i++){
			end = i;
			// 1) ํ˜„์žฌ ๋งํ•œ ๋‹จ์–ด๊ฐ€ ์ด์ „์— ๋“ฑ์žฅํ–ˆ๋˜ ๋‹จ์–ด์ธ ๊ฒฝ์šฐ
			if(!checkWords(words, words[i], end)){
				answer[0] = (i%n) + 1;
				answer[1] = (i/n) + 1;
				check = false;
				break;
			}

			// 2) ์•ž์‚ฌ๋žŒ์ด ๋งํ•œ ๋‹จ์–ด์˜ ๋งˆ์ง€๋ง‰ ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋‹จ์–ด๊ฐ€ ์•„๋‹๊ฒฝ์šฐ(e.g "never" - "now")
			if(i>0 && words[i-1].charAt(words[i-1].length()-1) != words[i].charAt(0)){
				answer[0] = (i%n) + 1;
				answer[1] = (i/n) + 1;
				check = false;
				break;
			}
		}

		// ์œ„ for๋ฌธ์—์„œ ํƒˆ๋ฝํ•˜๋Š” ์‚ฌ๋žŒ์ด ์—†๋Š” ๊ฒฝ์šฐ 1), 2)์— ๋ชจ๋‘ ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
		if(check) return new int[]{0, 0};

		return answer;
	}
}

์–ด์ œ๋Š” ArrayList ๋Œ€์‹  ํ˜„์žฌ์˜ ๋‹จ์–ด๊ฐ€ ๋ฐฐ์—ด์—์„œ ์ด์ „์— ์‚ฌ์šฉ๋œ ๋‹จ์–ด์ธ์ง€ ์•„๋‹Œ์ง€ ํ™•์ธ์„ ํ•˜๋Š” ๋ฉ”์†Œ๋“œ checkWords() 

๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋งค๊ฐœ๋ณ€์ˆ˜ end๋Š” ์–ด๋””๊นŒ์ง€ ๋ฐ˜๋ณต์„ ํ• ์ง€ ๊ฒฐ์ •ํ•ด์ฃผ๋Š” ๋ณ€์ˆ˜์ธ๋ฐ,

 

๋งŒ์•ฝ ์•„๋ž˜์—์„œ know๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ๋“ค์–ด์™”์„๋•Œ, ์•ž์—๊ฐ’(tank, kick)๊นŒ์ง€ ํ™•์ธํ•ด์•ผ ํ•˜๋ฏ€๋กœ i๊นŒ์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ for๋ฌธ์˜ i๊นŒ์ง€ ํ™•์ธํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

3 [tank, kick, know, wheel, land, dream, mother, robot, tank] [3,3]

๊ทธ ์™ธ ๋‚˜๋จธ์ง€๋Š” ๋™์ผํ•˜๋‹ค.

 

 

+ ์ฒซ ์ฝ”๋“œ์˜ if๋ฌธ์„ ํ•˜๋‚˜๋กœ ์ค„์ด๋ฉด ๋” ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค.

import java.util.*;

class Solution {
    public int[] solution(int n, String[] words) {
        int[] answer = new int[2];
        List<String> list = new ArrayList<String>();
        boolean flag = true;
        
        for(int i=0; i<words.length; i++){
            if(i>0 && words[i-1].charAt(words[i-1].length()-1) != words[i].charAt(0) 
               || list.contains(words[i])){   // ์ด์ „์— ๋“ฑ์žฅํ•œ ๋‹จ์–ด์ธ๊ฒฝ์šฐ
                answer[0] = (i%n) + 1;
                answer[1] = (i/n) + 1;
                flag = false;
                break;
            }
            
            list.add(words[i]); // ํ˜„์žฌ ๋‹จ์–ด ๋ฆฌ์ŠคํŠธ์— ๋„ฃ๊ธฐ
        }
        if(flag) return new int[]{0, 0};
        return answer;
    }
}

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€