알게되거나 배운부분:(int)Math.log10(number)  - 로그로 1~9 -> 0  10~99->1 구할수있음

나의풀이

class Solution {
    public int solution(String s) {
        int answer = 0; int min=s.length(); int money=s.length();
        String temp=""; int t=1;

        for(int i=1;i<=s.length()/2;i++)
        {
            for(int j=1;j*i<=s.length();j++)
            {
                if(temp.equals(s.substring((j-1)*i,j*i)))
                  {
                    t++;                          
                    if((j+1)*i>s.length())//마지막부분 예외처리
                    {
                        money-=(t-1)*i;  if(t<10){money+=1;}else if(t<100){money+=2;}else if(t<1000){money+=3;}
                        else if(t==1000){money+=4;}
                    }
                  }
                else
                {
                    money-=(t-1)*i;
                    temp=s.substring((j-1)*i,j*i);//0 2  2 4  4 6... 0 3  3 6   6 9 
                    if(t>1){if(t<10){money+=1;}else if(t<100){money+=2;}else if(t<1000){money+=3;}
                        else if(t==1000){money+=4;}
                           }
                    t=1;
                }
             }
              temp="";

                if(min>=money)
                {min=money;}
               money=s.length();
               t=1;   
        }
        answer=min;
        return answer;        
    }
}

다른사람의 풀이

class Solution {
    public int solution(String s) {
        int answer = 0;

        for(int i=1; i<=(s.length()/2)+1; i++){
            int result = getSplitedLength(s, i, 1).length();
            answer = i==1 ? result : (answer>result?result:answer);
        }

        return answer;
    }

    public String getSplitedLength(String s, int n, int repeat){
        if(s.length() < n) return s;
        String result = "";
        String preString = s.substring(0, n);
        String postString = s.substring(n, s.length());

        // 불일치 -> 현재까지 [반복횟수 + 반복문자] 조합
        if(!postString.startsWith(preString)){
            if(repeat ==1) return result += preString + getSplitedLength(postString, n, 1);
            return result += Integer.toString(repeat) + preString + getSplitedLength(postString, n, 1);
        }

        return result += getSplitedLength(postString, n, repeat+1);
    }
}

새로 알게된점 - Comparator의 이용, 자바 compareTo는 char에서 안된다

import java.util.*;
class Solution {
    
    public String[] solution(String[] strings, int n) {
        
        
        Arrays.sort(strings,new Comparator<String>(){
            
            public int compare(String s1, String s2){
                
                if(s1.charAt(n)==s2.charAt(n)){
                    System.out.print("dfg");
                  // return s1.charAt(n).compareTo(s2.charAt(n));
                    return s1.compareTo(s2);
                }
                else{
                    return s1.charAt(n)-s2.charAt(n);
                }
            }
        });
        
        for(String i:strings)
        {System.out.println(i);}
        String[] answer = strings;
  
        return answer;
    }
}

다른사람의풀이

알게된점 - Collections.reverse 이용해서도 가능

나의풀이

import java.util.*;
class Solution {
    public String solution(String s) {
        String answer = ""; //알아볼거-대소문자 무시, 대문자소문자 아스키대로 정렬인지/ 
        //string으로하면오래걸림..
        String [] arr = s.split("");
        Arrays.sort(arr,Comparator.reverseOrder());
        
        for(int i=0;i<arr.length;i++){
            answer+=arr[i];  
        }

        return answer;
    
    }
    
    
}

다른사람의 풀이

import java.util.*;

class Solution {
  public String solution(String s) {

      return s.chars().boxed().sorted(Collections.reverseOrder()).
      collect(StringBuilder::new, StringBuilder::appendCodePoint, 
      StringBuilder::append).toString();
  }
}

알게된점 - 1. Arrays.sort(With Comparator)는 Object(객체자료형)의 자손에 대해서만 정의되므로 기본자료형(Primitive) 에는 작동하지 않는다. Collections.reverseOrder() returns a Comparator<Object>

(참고:https://stackoverflow.com/questions/5584579/how-to-sort-an-array-in-reverse-order-using-java)  

2.  toCharArray-문자열을 char형 배열로,   String.valueOf(배열) -- 배열을 문자열로   Integer.parseInt Long.parseLong

나의풀이

import java.util.*;
import java.lang.*;

class Solution {
    public long solution(long n) {
        long answer = 0;
        //자릿수구하는 함수--숫자로풀기
        //string->long 내림차순--문자열로풀기 String.valueOf 
        //문자열 char배열로   문자열.toCharArray();
        String temp=String.valueOf(n);
        char [] hi=temp.toCharArray();
       // System.out.println(temp.length());
        char [] hi2=new char[temp.length()];
        Arrays.sort(hi);
        //Arrays.sort 기본자료형이 아닌 객체자료형 object의자손에만 적용
        for(int i=0;i<hi.length;i++)
        {
            hi2[i]=hi[hi.length-1-i];
        }
        
        answer=Long.parseLong(String.valueOf(hi2));
        return answer;
    }
}

알게된점 - 1. Arrays.sort(With Comparator)는 Object(객체자료형)의 자손에 대해서만 정의되므로 기본자료형(Primitive) 에는 작동하지 않는다. Collections.reverseOrder() returns a Comparator<Object>

(참고:https://stackoverflow.com/questions/5584579/how-to-sort-an-array-in-reverse-order-using-java)  

2.  toCharArray-문자열을 char형 배열로,   String.valueOf(배열) -- 배열을 문자열로   Integer.parseInt Long.parseLong

나의풀이

import java.util.*;
import java.lang.*;

class Solution {
    public long solution(long n) {
        long answer = 0;
        //자릿수구하는 함수--숫자로풀기
        //string->long 내림차순--문자열로풀기 String.valueOf 
        //문자열 char배열로   문자열.toCharArray();
        String temp=String.valueOf(n);
        char [] hi=temp.toCharArray();
       // System.out.println(temp.length());
        char [] hi2=new char[temp.length()];
        Arrays.sort(hi);
        //Arrays.sort 기본자료형이 아닌 객체자료형 object의자손에만 적용
        for(int i=0;i<hi.length;i++)
        {
            hi2[i]=hi[hi.length-1-i];
        }
        
        answer=Long.parseLong(String.valueOf(hi2));
        return answer;
    }
}

람다식,스트림에 대해서 배우고 써먹어봐는것도 필요할듯함

새로알게된것- GCD(A,B)=GCD(B,R)  A>B ,r은 나머지  

class Solution {
    public long[] solution(long n, long m) {
        long[] answer = new long[2];      // gcd(a,b) =gcd(b,r) a=max   
        long max=0;
        long min=0;        long mok=0; long na=0;   
        if(n>m)
        {max=n; min=m;}
        else
        {
            max=m; min=n;
        } 
        
        while(true){
        mok=max/min;
        na=max%min;
        
        if(na==0)
        {answer[0]=min;answer[1]=n*m/min; break;}
            
        max=min;
        min=na;
        }
        
 
        
        return answer;
    }
}

'코딩(알고리즘)' 카테고리의 다른 글

[LEVEL1] 정수 내림차순으로 배치하기  (0) 2022.03.30
[LEVEL1] 정수 내림차순으로 배치하기  (0) 2022.03.30
[LEVEL1] 다트 게임  (0) 2022.03.27
[LEVEL1] 비밀지도  (0) 2022.03.26
[level1] 키패드 누르기  (0) 2022.03.25

새로 배운것-Character.isDigit - char문자가 숫자인지 판별

나의 풀이

import java.util.*;
import java.lang.Math;
class Solution {
    public int solution(String dartResult) {
        int answer = 0;
        int [] arr=new int[3];
        int k=0;int t=0;
        String []number=new String[3];
        for(int w=0;w<3;w++)//초기화
        {number[w]="";}       
        for(int i=0;i<dartResult.length();i++)
        {
            if(dartResult.charAt(i)>=48&&dartResult.charAt(i)<=57)
            {                
                number[t]+=dartResult.charAt(i);
            }   
            if(dartResult.charAt(i)=='S'||dartResult.charAt(i)=='D'||dartResult.charAt(i)=='T')
            {   
                if(dartResult.charAt(i)=='S')
                { arr[k]=(int)Math.pow(Integer.parseInt(number[t]),1);}
                else if(dartResult.charAt(i)=='D')
                { arr[k]=(int)Math.pow(Integer.parseInt(number[t]),2);}
                else if(dartResult.charAt(i)=='T')
                { arr[k]=(int)Math.pow(Integer.parseInt(number[t]),3);}                
                 t++;   
                 if((i+1)<dartResult.length()&&dartResult.charAt(i+1)=='*')//스타
                 {
                     if(k==0)
                     {
                         arr[k]*=2;
                     }
                     else
                     {
                         arr[k]*=2; arr[k-1]*=2;
                     }
                  
                 }
                 else if((i+1)<dartResult.length()&&dartResult.charAt(i+1)=='#')//아차
                 {
                      if(k==0)
                     {
                         arr[k]*=-1;
                     }
                     else
                     {
                         arr[k]*=-1;
                     }
                 }         
                k++;
            }
        }    
        for(int p=0;p<3;p++)
        {
            answer+=arr[p];
        }     
        return answer;
    }
}

다른 사람의 풀이-

import java.util.*;
class Solution {
    public int solution(String dartResult) {
        Stack<Integer> stack = new Stack<>();
        int sum = 0;
        for (int i = 0; i < dartResult.length(); ++i) {
            char c = dartResult.charAt(i);
            if (Character.isDigit(c)) {
                sum = (c - '0');
                if (sum == 1 && i < dartResult.length() - 1 && dartResult.charAt(i + 1) == '0') {
                    sum = 10;
                    i++;
                }
                stack.push(sum);
            } else {
                int prev = stack.pop();
                if (c == 'D') {
                    prev *= prev;
                } else if (c == 'T') {
                    prev = prev * prev * prev;
                } else if (c == '*') {
                    if (!stack.isEmpty()) {
                        int val = stack.pop() * 2;
                        stack.push(val);
                    }
                    prev *= 2;
                } else if (c == '#') {
                    prev *= (-1);
                }
                // System.out.println(prev);
                stack.push(prev);
            }
        }
        int totalScore = 0;
        while (!stack.isEmpty()) {
            totalScore += stack.pop();
        }
        return totalScore;
    }
}

새로 익힌것

Integer.toBinaryString : 2진수 문자열로 변환하는거, or연산도 가능

String.format->%5s(다섯자리출력 값으면 앞에 0)

나의 풀이

import java.util.*;

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n];
        String[] a1 =new String[n];
        String[] a2 =new String[n];
        String before="";
        
        for(int i=0;i<n;i++){
            a1[i]=""; a2[i]="";
            for(int j=0;j<n-Integer.toBinaryString(arr1[i]).length();j++)//5개자리로 만들기
                {a1[i]+='0';  }      
             a1[i]+=Integer.toBinaryString(arr1[i]); //Integer.toBinaryString 문자열로변환         
             for(int j=0;j<n-Integer.toBinaryString(arr2[i]).length();j++)//5개자리로 만들기
                {a2[i]+='0';  }              
         a2[i]+=Integer.toBinaryString(arr2[i]); }
    
        // for(int i=0;i<n;i++){
        //   System.out.println(a1[i]+" "+a2[i]);
        // }
        for(int j=0;j<n;j++){answer[j]="";
        for(int i=0;i<n;i++)
        {
            if(a1[j].charAt(i)=='1'||a2[j].charAt(i)=='1'){
                answer[j]+="#";
            }
            else
            {
                answer[j]+=" ";
            }       
            
        }
        }
 
        return answer;
    }
}

다른 사람의 풀이 - String.format

class Solution {
  public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] result = new String[n];
        for (int i = 0; i < n; i++) {
            result[i] = Integer.toBinaryString(arr1[i] | arr2[i]);
        }

        for (int i = 0; i < n; i++) {
            result[i] = String.format("%" + n + "s", result[i]);
            result[i] = result[i].replaceAll("1", "#");
            result[i] = result[i].replaceAll("0", " ");
        }

        return result;
    }
}

'코딩(알고리즘)' 카테고리의 다른 글

[LEVEL1] 최대공약수와 최소공배수  (0) 2022.03.28
[LEVEL1] 다트 게임  (0) 2022.03.27
[level1] 키패드 누르기  (0) 2022.03.25
[LEVEL1] 핸드폰번호 가리기  (0) 2022.03.23
[LEVEL1] 행렬의 덧셈  (0) 2022.03.23

나의풀이-무식한방법

import java.lang.*;
class Solution {
    public String solution(int[] numbers, String hand) {
        String answer = "";
        int lefthand=10; int righthand=11;
        char [][]phone={{1,2,3},{4,5,6},{7,8,9},{'*',0,'#'}};
        int [][] gps = new int[12][12];
        gps[1][2]=1;gps[1][5]=2;gps[1][8]=3;gps[1][0]=4;
        gps[4][2]=2;gps[4][5]=1;gps[4][8]=2;gps[4][0]=3;
        gps[7][2]=3;gps[7][5]=2;gps[7][8]=1;gps[7][0]=2;
        gps[3][2]=1;gps[3][5]=2;gps[3][8]=3;gps[3][0]=4;
        gps[6][2]=2;gps[6][5]=1;gps[6][8]=2;gps[6][0]=3;
        gps[9][2]=3;gps[9][5]=2;gps[9][8]=1;gps[9][0]=2;
        gps[2][5]=1;gps[2][8]=2;gps[2][0]=3;
        gps[5][2]=1;gps[5][8]=1;gps[5][0]=2;
        gps[8][2]=2;gps[8][5]=1;gps[8][0]=1;
        gps[0][2]=3;gps[0][5]=2;gps[0][8]=1;
        gps[10][2]=4;gps[10][5]=3;gps[10][8]=2;gps[10][0]=1;
        gps[11][2]=4;gps[11][5]=3;gps[11][8]=2;gps[11][0]=1;
        for(int l=0;l<12;l++){
            {gps[l][l]=0;}
        }
        
        for(int i:numbers){   
        if(i==1||i==4||i==7)
        {answer+='L';
        lefthand=i;
        }
        if(i==3||i==6||i==9)
        {answer+='R';
        righthand=i;
        }
        if(i==2||i==5||i==8||i==0)
        {   
            if(gps[lefthand][i]  >  gps[righthand][i])
            { answer+='R'; righthand=i;}
            else if (gps[lefthand][i]  < gps[righthand][i])
            {answer+='L';lefthand=i;}
            else{ 
                if(hand.equals("right"))
                {answer+='R';righthand=i;}
                else
                {answer+='L';lefthand=i;}
             }
        
        }
        }
    return answer;
    }
}

다른풀이- hashmap사용

import java.util.HashMap;

class Solution {
      public static String solution(int[] numbers, String hand) {
            String answer = "";
            HashMap<Integer, int []> hm = new HashMap<>();
            hm.put(0, new int[] {3,1});
            hm.put(1, new int[] {0,0});
            hm.put(2, new int[] {0,1});
            hm.put(3, new int[] {0,2});
            hm.put(4, new int[] {1,0});
            hm.put(5, new int[] {1,1});
            hm.put(6, new int[] {1,2});
            hm.put(7, new int[] {2,0});
            hm.put(8, new int[] {2,1});
            hm.put(9, new int[] {2,2});
            int lx=0,ly=3,rx=2,ry=3;
            for(int i = 0 ; i < numbers.length ; i++) {
                int [] now = hm.get(numbers[i]);
                if(now[1] ==0) {
                    answer +="L";
                    lx = now[1];
                    ly = now[0];
                } else if(now[1] ==2) {
                    answer +="R";
                    rx = now[1];
                    ry = now[0];

                } else {
                    // 거리계산
                    if(Math.abs(lx - now[1]) + Math.abs(ly - now[0]) >  Math.abs(rx - now[1]) + Math.abs(ry - now[0]) ) {
                        // 오른쪽이 가까운경우
                        rx = now[1]; ry = now[0];
                        answer +="R";
                    } else if( Math.abs(lx - now[1]) + Math.abs(ly - now[0]) <  Math.abs(rx - now[1]) + Math.abs(ry - now[0]) ) {
                        lx = now[1]; ly = now[0];
                        answer +="L";
                    } else {
                        char t = Character.toUpperCase(hand.charAt(0));
                        if(t == 'R') {
                            rx = now[1] ; ry = now[0];
                        } else {
                            lx = now[1] ; ly = now[0];
                        }
                        answer += t;
                    }
                }
            }

            return answer;
        }
}

다른풀이-

class Solution {
    //        0부터 9까지 좌표 {y,x}
    int[][] numpadPos = {
            {3,1}, //0
            {0,0}, //1
            {0,1}, //2
            {0,2}, //3
            {1,0}, //4
            {1,1}, //5
            {1,2}, //6
            {2,0}, //7
            {2,1}, //8
            {2,2}  //9
    };
    //초기 위치
    int[] leftPos = {3,0};
    int[] rightPos = {3,2};
    String hand;
    public String solution(int[] numbers, String hand) {
        this.hand = (hand.equals("right")) ? "R" : "L";

        String answer = "";
        for (int num : numbers) {
            String Umji = pushNumber(num);
            answer += Umji;

            if(Umji.equals("L")) {leftPos = numpadPos[num]; continue;}
            if(Umji.equals("R")) {rightPos = numpadPos[num]; continue;}
        }
        return answer;
    }

    //num버튼을 누를 때 어디 손을 사용하는가
    private String pushNumber(int num) {
        if(num==1 || num==4 || num==7) return "L";
        if(num==3 || num==6 || num==9) return "R";

        // 2,5,8,0 일때 어디 손가락이 가까운가
        if(getDist(leftPos, num) > getDist(rightPos, num)) return "R";
        if(getDist(leftPos, num) < getDist(rightPos, num)) return "L";

        //같으면 손잡이
        return this.hand;
    }

    //해당 위치와 번호 위치의 거리
    private int getDist(int[] pos, int num) {
        return Math.abs(pos[0]-numpadPos[num][0]) + Math.abs(pos[1]-numpadPos[num][1]);
    }
}

'코딩(알고리즘)' 카테고리의 다른 글

[LEVEL1] 다트 게임  (0) 2022.03.27
[LEVEL1] 비밀지도  (0) 2022.03.26
[LEVEL1] 핸드폰번호 가리기  (0) 2022.03.23
[LEVEL1] 행렬의 덧셈  (0) 2022.03.23
[LEVEL1] 문자열을 정수로 바꾸기  (0) 2022.03.23

나의풀이

class Solution {
    public String solution(String phone_number) {
        String answer = "";
        char[] sum = new char[phone_number.length()];

        for(int i=0;i<phone_number.length()-4;i++)
        {
            answer+='*';
        }
        for(int i=phone_number.length()-4;i<phone_number.length();i++)
        {
            answer+=phone_number.charAt(i);
        }  
        
        return answer;
    }
}

다른사람 풀이-subString사용

class Solution {
  public String solution(String phone_number) {
      String answer = "";

        for (int i = 0; i < phone_number.length() - 4; i++)
            answer += "*";

        answer += phone_number.substring(phone_number.length() - 4);

        return answer;
  }
}

 

다른사람 풀이-toCharArray()사용

class Solution {
  public String solution(String phone_number) {
     char[] ch = phone_number.toCharArray();
     for(int i = 0; i < ch.length - 4; i ++){
         ch[i] = '*';
     }
     return String.valueOf(ch);
  }
}

다른사람 풀이-정규식사용

class Solution {
  public String solution(String phone_number) {
    return phone_number.replaceAll(".(?=.{4})", "*");
  }
}

'코딩(알고리즘)' 카테고리의 다른 글

[LEVEL1] 비밀지도  (0) 2022.03.26
[level1] 키패드 누르기  (0) 2022.03.25
[LEVEL1] 행렬의 덧셈  (0) 2022.03.23
[LEVEL1] 문자열을 정수로 바꾸기  (0) 2022.03.23
[LEVEL1] 문자열다루기 기본  (0) 2022.03.23

+ Recent posts