본문 바로가기

프로그래머스/2단계

스킬트리[java]

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

 

코딩테스트 연습 - 스킬트리

 

programmers.co.kr

//문제풀이 해석

/*
다른 스킬들의 순서는 상관없고(SKILL로 제공된 것들이 skill_trees에 없다면 배울수있음)
skill로 제공된 것의 순서가 맞아야함
CBD일경우 C CB CBD만 가능
*/


//실수한부분

//skill에 제공된것이 없다면 배울 수 없다고 착각하고 문제를 시작해버림 
//조건에 대해 제대로 생각을 하지 않음 if문 쓰는것 그냥 생각나는대로 써버림
//문제 해석만하고 요구사항을 머리로만 정리 후 문제 풀이에 대한 방법을 생각하지 않음



//경우의수 if문 해석

//두가지 경우의 수가있는데
//ex cbd를 예시로놓고
//1.c와 b가 들어있는데 b의 index가 0이고 c가 1일때 순서가 맞지않아 안됨
//이때 prev > now 라는 조건이 만들어지고
//now가 index에없다면 무조건 크기때문에 now !=-1 이라는 조건을 추가하게됨

//1에서 cbd가 순서가 맞지가않는것에 대한 것을 했다면
//2에서는 이전 스킬이 있는지에 대해 판단한다
//2.이전스킬이 없는데 = index==-1인데
//다음스킬이 있다면 index>0 이라면 순서대로 스킬을 배워야하는 조건에 맞지않다

 

 

 

class Solution {
    public int solution(String skill, String[] skill_trees) {
      
        int answer = 0;
        for(int j=0;j<skill_trees.length;j++){
            
            int prev=skill_trees[j].indexOf(skill.charAt(0));
            int now=0;
            boolean check = true;
            for(int i=1; i<skill.length();i++)
            { 
                now=skill_trees[j].indexOf(skill.charAt(i));
                if((prev > now && now !=-1) || (prev ==-1 && now != -1))
                {
                    check=false;
                    break;
                }
                prev=now;        
            }
            if(check==true)
            {
               answer++;
            }
        
        }
        return answer;
    }
}

----------------------------------------

다른사람 풀이

 

이 문제의 핵심은 skill이라는 것이 skill_trees에 들어있다면 순서에 맞게 포함되어있는것을 보는것이였다

그러면 다른 필요없는 것들은 skill_tress에서 삭제하고 순서에 맞게 들어가있는지를 확인 하면됬던 문제였다.

 

여기서알게된사실 indexOf("")는 0이다

class Solution {
    public int solution(String skill, String[] skill_trees) {
      
        int answer = 0;
        for(int j=0;j<skill_trees.length;j++){ 
         String re = skill_trees[j].replaceAll("[^"+skill+"]","" );
           if(skill.indexOf(re)==0)
           {
            answer++;
           }
        }
        return answer;
    }
}

 

--------------------------------------

밑 맨 처음 코드

위 if문의 생각은 같았지만 제대로 해석하지못해 간결하게 생각하지 못했음

 

import java.util.*;
class Solution {
    public int solution(String skill, String[] skill_trees) {
      
        int answer = 0;
        int[] check = new int[skill.length()];
        //맨처음 나온게 1이아니다 break;
        List<Integer> list = new ArrayList<Integer>();
        move :
        for(int j=0;j<skill_trees.length;j++){
          
           list = new ArrayList<Integer>();  
         for(int i=0;i<skill_trees[j].length();i++)
         {
             int index=skill.indexOf(skill_trees[j].charAt(i));
             //맨처음 나온게 1이아니다 break;
             if(index !=-1)
             {
                 list.add(index);
             }   
         }
            if(list.size()>0 && list.get(0) !=0)
             {
                 continue move;
             }
            if(list.size()==1 && list.get(0) ==0)
            {
                answer++;
                continue move;
            }
             int prev=0;
             if(list.size()>0)
             {
                 prev=list.get(0);
             }
            boolean bcheck=true;
         mo:
         for(int k=1;k<list.size();k++){
            
             if(prev ==-1)
             {
                 
                if(list.get(k) !=-1)
                {
                  bcheck=false;
                  break; 
                }
             }
             else
             {
                if(list.get(k) == -1)
                {
                    prev=list.get(k);
                    continue mo;
                }
                if(prev+1 != list.get(k))
                {
                  bcheck=false;
                  break;
                }
                prev=list.get(k);
                       
             }
         }
         if(bcheck==true)
         {
            answer++;
         }
        }
        return answer;
    }
}

 

'프로그래머스 > 2단계' 카테고리의 다른 글

기능개발[JAVA]  (0) 2022.07.14
멀쩡한 정사각형[JAVA]  (0) 2022.07.04
문자열 압축  (0) 2022.06.22
구명보트  (0) 2021.11.05