본문 바로가기
ALGORITHM/푼 문제들&과정

[JAVA] 백준 8958번

by sjs_2215 2019. 3. 9.

문제

 

자바 문자열 비교는 EQUALS쓰라고 좀.

왜 맨날 습관처럼 == 쓰고선 뻘짓 최소 30분.

 

 

  • 연속되어~같은 문자일 경우를 찾으라는 문제일 때 어떻게 풀어야 하나?

    배열에 집어넣고 배열[X+1]하면 인덱스바운드 익셉션이 나기 때문

    예제) 연속되면 SCORE값을 올리는 것

    변수를 하나 더 설정해줘서 초기값 정해주고 FOR문 돌면서 계속 업데이트 해줘야 함

     

check=splits[0];//첫 문자를 기억
    System.out.println("CHECK 0값은"+check);

    for(int i=1;i<splits.length;i++){
        if(!check.equals(splits[i])){
            check=splits[i];//연속 안되니 check값을 업데이트.
        }
        else if(check.equals(splits[i])){
            score++;
            sum[i]=score;
        }           
    }   

 

 

  • sum[] 따로 생성해서 연속될때마다 해당 점수를 (for문돌려서) 각 i 인덱스에 점수를 집어넣기로 함.

    그 후 sum[] 안의 값들 다 더해서 정답 출력하기로 생각함

 

 

  • o가 연속되다가 다시 x가 나온다면 score값을 다시 0으로 초기화 시켜야 하는 것.

이것도 별도의 값을 선언해주고 초기값 주고 업데이트하는 방법으로

IF문에서 걸리면 SCORE값 없데이트

 

 

  • 연속되는 문자가 0일때만 해당되기에 위 else if문의 조건을 하나 더 추가해줌

else if(check.equals(splits[i])&&check.equals("O")){
            score++;
            sum[i]=score;
        }   

 

 

 


문제 ㅈㄴ 잘못 이해하고 있었음

연속해서 맞은 문제만 점수에 들어가는 줄 알았는데 하,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

그마저도 점수 제대로 안나왔지만

아까우니까 여기 세이브

 

package till;
import java.util.*;

public class Main {
    public static void main(String[] args){
        Scanner scan=new Scanner(System.in);
        int case_num=scan.nextInt();
        String[] inputs=new String[case_num];
        
        for(int i=0;i<inputs.length;i++){
            inputs[i]=scan.next();
        }
        
        for(int i=0;i<inputs.length;i++){
            System.out.println("input한 것들: "+inputs[i]);
            //System.out.println(inputs[i]);
            System.out.println("total점수는: "+score(inputs[i]));
        }
    }

public static int score(String x){
    String splits[];
    splits=x.split("");
    int score=0;
    int[] sum=new int[splits.length];
    int total=0;
    String check;
    int temp=0;
    check=splits[0];//첫 문자를 기억
    System.out.println("CHECK 0값은"+check);

    for(int i=1;i<splits.length;i++){
        if(!check.equals(splits[i])){
            check=splits[i];//연속 안되니 check값을 업데이트.
            score=sum[i-1];//IF문에서 걸리면 SCORE값 없데이트
            System.out.println("check값"+i+"의 값은: "+check);
            score=0;
        }
        else if(check.equals(splits[i])&&check.equals("O")){
            
            score++;
            sum[i]+=score+1;    
            
        }   
        
    }
        
    for(int i=0;i<sum.length;i++){
        total+=sum[i];
        System.out.println("점수가 들어있는"+i+"의 값은: "+sum[i]);

    }
    System.out.println(total);
    return total;
}
}

 


두 번째 시도:

문제점:

문제에 나와있는 input값은 정답 잘 나옴

그러나 xxxoxxxx 이런 값은 잘 안나옴

그래서 if-else문 조건식 갈아 엎기로 함

package till;
import java.util.*;

public class Main {
    public static void main(String[] args){
        Scanner scan=new Scanner(System.in);
        int case_num=scan.nextInt();
        String[] inputs=new String[case_num];
        
        for(int i=0;i<inputs.length;i++){
            inputs[i]=scan.next();
        }
        
        for(int i=0;i<inputs.length;i++){
            System.out.println("input한 것들: "+inputs[i]);
            //System.out.println(inputs[i]);
            System.out.println("total점수는: "+score(inputs[i]));
        }
    }

public static int score(String x){
    String splits[];
    splits=x.split("");
    int score=0;
    int[] sum=new int[splits.length];
    int total=0;
    String check;
    int temp=0;
    check=splits[0];//첫 문자를 기억
    System.out.println("CHECK 0값은"+check);

    for(int i=1;i<splits.length;i++){
        if(!check.equals(splits[i])){ //연속되지 않을 경우
            check=splits[i];//연속 안되니 check값을 업데이트.
            score=sum[i-1];//IF문에서 걸리면 SCORE값 없데이트
            score=0;
            if(check.equals("O")){
                sum[i]=1;
            }
        }
        else if(check.equals(splits[i])&&check.equals("O")){
            if(splits[0].equals("O")){
                sum[0]=1;
            }
            score++;
            sum[i]+=score+1;    
            
        }
        
    }
        
    for(int i=0;i<sum.length;i++){
        total+=sum[i];
        System.out.println("점수가 들어있는"+i+"의 값은: "+sum[i]);

    }
    System.out.println(total);
    return total;
}
}

세 번째 시도:

정답 봄

그냥..O나올때마다 CHECK값 ++해주고,

그렇게 증가한 값 점수만 저장해놓는 배열에 넣어두면 됐음

그리고 다시 X가 나오면 CHECK가 0 이 되야하는데

그건 그냥 ELSE문에 CHECK=0하면 됐음...

 
import java.util.*;
​
public class Main {
    public static void main(String[] args){
        Scanner scan=new Scanner(System.in);
        int case_num=scan.nextInt();
        String[] inputs=new String[case_num];
        
        for(int i=0;i<inputs.length;i++){
            inputs[i]=scan.next();
        }
        
        for(int i=0;i<inputs.length;i++){
            score(inputs[i]);
        }
    }
​
public static int score(String x){
    String splits[];
    splits=x.split("");
    int[] sum=new int[splits.length];
    int total=0;
    int check;
    
    for(int i=0;i<splits.length;i++){
        if(splits[i].equals("O")){
            total++;//0보일때마다 1씩 증가
            sum[i]=total;//0이 나온 인덱스i를 기억해 점수만 집어넣는 배열[i]에 total값 넣는다.
        }
        else{
            total=0;
        }
        
    }
        
    for(int i=0;i<sum.length;i++){
        total+=sum[i];//점수 총 합하기
        //System.out.println("점수가 들어있는"+i+"의 값은: "+sum[i]);
​
    }
    System.out.println(total);
    return total;
}
}

 

'ALGORITHM > 푼 문제들&과정' 카테고리의 다른 글

해결 x, 기억 o 문제 list  (0) 2019.08.21
[JAVA] 백준 1110번  (0) 2019.03.03
[JAVA] 백준 1065번  (0) 2019.03.03
[JAVA] 백준 4344번  (0) 2019.02.27
[JAVA] 백준 4673번  (0) 2019.02.26

Comments