workSpace/ALGORITHM

[행운의 번호]

J o e 2021. 2. 2. 08:19

[문제]

행운의 번호는 2*n 자릿수를 가진 숫자인데, 왼쪽에서부터 n 개의 숫자의 합이 오른쪽에서부터 n 개의 숫자의 합과 같다.

당신에게 0을 제외한 숫자로만 이루어진 문자열 s가 주어진다. 이 문자열의 부분문자열 중 가장 긴 행운의 번호의 길이를 구하시오. 만약 행운의 번호가 없다면 0을 반환하시오.

풀이 1) - python

더보기
class Solution:
    def solution(self, s):
        answer=0
        s=[int(i) for i in s]
        for i in range(len(s)-1):
            left=i
            right=left+1
            left_ck=right_ck=0
            while left>=0 and right<len(s):
                left_ck+=s[left]
                right_ck+=s[right]
                if left_ck==right_ck:
                    answer=max(answer,right-left+1)
                left-=1
                right+=1
        return answer

풀이 2) - java

더보기
import java.lang.*;
//핵심 소스코드의 설명을 주석으로 작성하면 평가에 큰 도움이 됩니다.
public class Solution{
    public int solution(String s){
        int answer=0;
        if(s.length()%2==0){
            int len = s.length();
            while(len>=2){
                for(int temp=s.length();temp>=len;temp--){
                    if(check(s.substring(temp-len,temp))) return len;    
                }
                len-=2;
            }
        }else{
            int len = s.length()-1;
            while(len>=2){
                for(int temp=s.length();temp>=len;temp--){
                    if(check(s.substring(temp-len,temp))) return len;    
                }
                len-=2;
            }
        }
        return answer;
    }
    public boolean check(String s){ //부분 문자열이 행운 숫자인지 판단하는 메소드
        if(s.length()%2!=0) return false;   //문자열 길이가 홀수면 false 반환(예외발생을 막기위한 작업)
        else{   //문자열 길이가 참일경우
            int front=0, back=0;
            for(int i=0;i<s.length();i++){
                if(i<s.length()/2) front+=(int)(s.charAt(i));    //절반기준 앞숫자들의 합
                else back+=(int)(s.charAt(i));   //절반기준 뒷숫자들의 합
            }
            if(front==back) return true;
            else return false;
        }
    }
}

풀이 3) - python

더보기
class Solution:
    def solution(self, s):
        result = 0
        tmp = list(map(int, list(s)))
 
        for i in range(2, len(s)+1, 2):
            for j in range(0, len(s)-i+1):
                if sum(tmp[j:j+i//2]) == sum(tmp[j+i//2:j+i]):
                    result = i
 
        return result