TIL/Coding Test

[LeetCode] Roman to Integer

반응형

오느릐 문제. 로마 숫자를 정수형태로 바꿔보기.

leetcode.com/problems/roman-to-integer/

 

Roman to Integer - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

아래는 처음에 푼 방식. 제대로 작동하기는 했으나 속도도 느리고.. 음.. 

public class cote0312_13_RomanToInteger {
    public int romanToInt(String s) {
        //s의 길이를 알아야겠징
        int[] iArr=new int[s.length()];
        String[] arr=s.split("");
        for(int i=0; i<s.length(); i++){
            System.out.println(arr[i]);
            //s에 대해 포문을 돌려서 각 자릿수가 어떤 문자인지 숫자로 치환한다 
            switch(arr[i]){
                case "I": iArr[i]=1;
                break;
                case "V": iArr[i]=5;
                break;
                case "X": iArr[i]=10;
                break;
                case "L": iArr[i]=50;
                break;
                case "C": iArr[i]=100;
                break;
                case "D": iArr[i]=500;
                break;
                case "M": iArr[i]=1000;
                break;
                default: break;
            }
        }
        if(iArr.length==1){
            return iArr[0];
        }
        
        int sum=0;
        //iArr에서 이제 계산을 시작한다
        for(int i=0; i<iArr.length; i++){
            System.out.println(iArr[i]);
        }
        
        for(int i=0; i<iArr.length-1; i++){
            //앞에거가 뒤에거보다 작으면 뒤에거에서 앞에거를 뺀다 
            if(iArr[i] < iArr[i+1]){
                sum+=(iArr[i+1]-iArr[i]);
                i++;
            }else{ //앞에거가 뒤에거보다 크거나 같으면 더한다
                sum+=iArr[i];
            }
            //마지막거면 마지막 젤 작은 수를 더해준다
            if(i==iArr.length-2){
                sum+=iArr[iArr.length-1];
            }
            
            System.out.println(sum);
        }

        return sum;
    }
}

아래는 스터디 후 코드를 줄여본 방식 (improved) 그렇지만 그렇게 효율적인 방법은 아닌가보다.

 public int romanToInt(String s) {
        //s의 길이를 알아야겠징
        int[] iArr=new int[s.length()];
        String[] arr=s.split("");
        for(int i=0; i<s.length(); i++){
            //s에 대해 포문을 돌려서 각 자릿수가 어떤 문자인지 숫자로 치환한다 
            switch(arr[i]){
                case "I": iArr[i]=1;
                break;
                case "V": iArr[i]=5;
                break;
                case "X": iArr[i]=10;
                break;
                case "L": iArr[i]=50;
                break;
                case "C": iArr[i]=100;
                break;
                case "D": iArr[i]=500;
                break;
                case "M": iArr[i]=1000;
                break;
                default: break;
            }
        }
        
        int sum=0;
        
        //iArr에서 이제 계산을 시작한다        
        for(int i=0; i<iArr.length; i++){
            //앞에거가 뒤에거보다 작으면 뒤에거에서 앞에거를 뺀다. i가 끝에서 두번째까지만.
            if(i<iArr.length-1 && iArr[i] < iArr[i+1]){
                sum+=(iArr[i+1]-iArr[i]);
                i++;
            }else{ //앞에거가 뒤에거보다 크거나 같으면 더한다
                sum+=iArr[i];
            }
        }
        return sum;
    }

트리문제도 그렇고 이 문제도 그렇고, 더한 값을 구하시오 할 때는 빼는 방법을 항상 생각해봐야 할 것 같다. 더한 값과 뺀 값이 일반적으로 생각하기엔 전혀 다른 값일 거 같은데 막상 코드에서는 결과값을 체크해서 확인할 수 있기 때문에 완전히 다른 방법이 있을 수 있더라구.

728x90
반응형

'TIL > Coding Test' 카테고리의 다른 글

[LeetCode] Two Sum  (0) 2021.03.16
[LeetCode] Top K Frequent Elements  (0) 2021.03.15
[LeetCode] Path Sum  (2) 2021.03.11
[LeetCode] Binary Tree Inorder Traversal  (2) 2021.03.10
[LeetCode] Reverse String  (0) 2021.03.09