티스토리 뷰

반응형

백준 문제 보기(글자 클릭하면 링크 이동)

백준 문제 사진

 

 

문제 이해는 그리 어렵지 않을 것이다.

(하지만 오늘도 필자는 엉뚱한 부분에서 해맸다.)

(그 부분은 뒤에서,,)

 

바로 코드로 들어가보자.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        // 이전에 같은 값이었으면
		// count++;
        // 이전에 다른 값이었으면
		// count 초기화하고 1으로 바꿈.
        int sum = 0;
        int count = 1;
        for (int i = 0; i < N; i++) { // 줄 수 만큼 반복
            String str = br.readLine();
            String arr[] = new String[str.length()];
            StringBuilder sb = new StringBuilder();
            sum = 0;
            count = 1;
            for (int j = 0; j < str.length(); j++) { // 갯수만큼 반복
                arr[j] = str.substring(j, j + 1);
                if (arr[j].equals("O")) {
                    if (j > 0) {
                        if (arr[j].equals(arr[j - 1])) {
                            count++;
                            sum += count;
                        } else {
                            count = 1;
                            sum += count;
                        }
                    } else {
                        sum += count;
                    }
                }
            }
            System.out.println(sum);
        }
    }
}

 

이전 게시글에서 말했던 대로

앞으로 문제를 풀면서 작성했던

필요한 주석들은(?)

남겨 두도록 하겠다.

 

필자가 문제를 풀면서 어떻게 접근했는지 

같이 보면 도움이 될 것 같다.

 

이전 게시글이 궁금한 사람은 보러 가는 것을 추천한다..ㅎㅎ

필자가 문제를 푸는 약간의 꿀팁(?)이 들어있다!

('이전 게시글' 글자를 누르면 해당 링크로 이동한다.)

 

 


자 이제 본론으로 들어가서

필자의 주석을 먼저 보자.

 

필자는 문제를 보면서

약간 알고리즘(?) 적으로 생각하는데

주석과 같은 방식으로 생각했다.

 

직전에 같은 값이 있으면
(물론 문제는 당연히 O일때)
count를 증가시키고,

이전에 X였으면
(O 반대는 X이니까)
count를 1로 변경



그래서 작성한 코드를 보면

첫번째 for문으로 줄 수(테스트 케이스)만큼 반복하고

두번째 for문으로 한 줄을 문제 수만큼 반복하는데

arr에 각 문제의 정오를 담기 위해

substring을 이용해 문자열을 자르고,

 

이 알고리즘대로 문제가 O일때 -> j가 0이상일 때

(🤔왜냐? 이전의 값과 비교해 같으면 count++해줘야하는데

j==0일 경우,

arr[j].equals(arr[j-1])이 에러가 뜨므로)

 

남은 조건은 주석으로 설명했으니 아래의 사진을 보자.

조건 설명

 

 

각 조건이 어떤 경우를 의미하는지를 주석으로 적어놓았으니

참고하자.

딱히 이해하는데 어려움은 없을 것이다.

 


 

🤔 오늘도 필자가 해맨 부분을 소개하겠다,,

오늘도 역시 멍청이 실수를 했는데

조건은 다 제대로 작성했으나

arr[j].equals로 작성해야 하는 코드를

arr[j]==arr[j-1]로 작성해서

한참을 삽질했다;;;

 

혹여나 필자와 같은 실수를 한 사람들을 위해

(아 물론 독자분들이 실수하는건 멍청이 실수가 아니다,, 암튼 그렇다,,)

👉 equals와 ==의 차이점을 소개하자면

equals의 경우 메서드이기 때문에

()안의 내용을 비교한다.

 

📌

즉 두 대상의 값 자체를 비교한다!

 

 

==의 경우 객체의 주소를 비교한다.

 

기본 타입 int형, char형 등은 대상에 주소값을 가지지 않고 쓰이기 때문에

==(동등비교)가 가능하지만

 

String은 클래스 이기 때문에

생성할 때마다 새로운 주소값이 부여된다.

 

 

 

📌

 그래서 String 타입의 경우 '값' 자체는

같아도 '주소'는 다르다!!

 

 

조금 더 자세한 설명은

따로 포스팅을 통해 설명하겠다.

(포스팅을 보려면 여기 클릭)

 

 

어쨌든 이 문제에선

String의 '값' 비교이기 때문에

equals를 써야한다!!

 

자, 이제 실행결과를 보자.

 


실행결과

실행결과

 


필자가 했던 실수를 제외하면

딱히 헷갈리거나 어렵지 않은 문제였다.

 

문제를 보다 이해가 안되거나 설명이 이상한 부분이 있다면 댓글을 활용해주길 바란다.

반응형