알고리즘 공부/문제 풀이

[2019 카카오 겨울인턴] 튜플 (JAVA)

valid_ming 2020. 5. 6. 22:01

<접근 방법>

 

1. 입력으로 들어온 스트링을 1 1,2 1,2,3 ... 과 같이 정리하기

 

1) 입력의 첫번째와 마지막을 감싸고 있는 중괄호 벗겨내기

->String 메서드 s.substring 이용

2) 입력의 "},{"을 "/" 로 치환하기

-> replace 이용

split에 "},{" 들어가면 오류나서.. 아마 입력에 "},{"가 한 묶음처럼 나타나지 않는 부분도 있어서 그런듯

3) 치환된 "/"를 기준으로 스트링 나누어 스트링배열 만들기

-> String 메서드 s.split("") 이용

 

	        String subS=s.substring(2, s.length()-2);
	        subS=subS.replace("},{","/");
	        String[] arrS=subS.split("/");
	        answer=new int[arrS.length];
	        

 

2. 정리된 스트링 배열을 오름차순으로 정리하기

 

Arrays.sort(배열,정렬방법)

-> 정렬방법 : Comparator 이용하여 정의 

 

	        Comparator<String> c = new Comparator<String>() { 
	        	public int compare(String s1, String s2) { 
	        		return Integer.compare(s1.length(), s2.length()); 
	        		} 
	        }; 
	        	
	        Arrays.sort(arrS, c);
	        

 

3. (실패했지만 나의 시도)

 

1) 반복문을 통해 스트링 배열에 접근

2) 해당 원소의 ","를 없앤다

-> s[i]=s[i].replace(",","")

3) 그러면 남은 것은 오직 숫자뿐! 그것을 정답 배열에 넣어준다

4) 바로 다음 원소부터 끝까지 이 숫자를 ","로 치환한다

5) 반복반복

	        for(int i=0;i<arrS.length;i++) {
	         	arrS[i]=arrS[i].replace(",","");
	        	answer[i]=Integer.parseInt(arrS[i]);
	        	for(int j=i+1;j<arrS.length;j++) {
	        		String num=Integer.toString(answer[i]);
	        		arrS[j]=arrS[j].replace(num, ",");
	        	}
	        }

 

몇몇 테스트케이스에 대해선 정답인데, 틀린 경우가 나옴 ㅠㅠ 

아직도 왜인지 모르겠음 흑흑

 

4. (정답인 남의 시도)

 

1) HashSet를 활용한다 : 중복 허용하지 않고 순서 관계없는 자료구조

2) for-each 반복문으로 생성한 배열에 접근

3) 배열 원소를 ","로 split하여 하나하나 숫자에 대해 접근

4) HashSet에 넣을 수 있다면 정답배열로 넣기

 

	        
	        Set<String> set=new HashSet<String>();
	        
            int idx=0;
	        
	        for(String s1: arrS){
                for(String s2: s1.split(",")){
                    if(set.add(s2)) answer[idx++]=Integer.parseInt(s2);
                }
            }        
    

으앙으앙 

 

<전체코드>

package kakao;

import java.util.*;

public class tuple {
	 static int[] solution(String s) {
	        int[] answer;
	        Set<String> set=new HashSet<String>();
	        
	        String subS=s.substring(2, s.length()-2);
	        subS=subS.replace("},{","/");
	        String[] arrS=subS.split("/");
	        answer=new int[arrS.length];
	        
	        
	        Comparator<String> c = new Comparator<String>() { 
	        	public int compare(String s1, String s2) { 
	        		return Integer.compare(s1.length(), s2.length()); 
	        		} 
	        }; 
	        	
	        Arrays.sort(arrS, c);
	        
	        /*
	        for(int i=0;i<arrS.length;i++) {
	         	arrS[i]=arrS[i].replace(",","");
	        	answer[i]=Integer.parseInt(arrS[i]);
	        	for(int j=i+1;j<arrS.length;j++) {
	        		String num=Integer.toString(answer[i]);
	        		arrS[j]=arrS[j].replace(num, ",");
	        	}
	        }
	        */
	        
	        int idx=0;
	        
	        for(String s1: arrS){
                for(String s2: s1.split(",")){
                    if(set.add(s2)) answer[idx++]=Integer.parseInt(s2);
                }
            }        
    
	        
	        return answer;
	 }

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int[] a=solution("{{4,2,3},{3},{2,3,4,1},{2,3}}");
		for(int i=0;i<a.length;i++) {
			System.out.println(a[i]);
		}
	}

}

 

 

제 코드 반례좀 찾아주세용 ㅠㅠ

 

for-each 친숙해지기!

자료구조 능숙하게 사용하기