백준 (2)

 

 

 

<문제 링크>

 

https://www.acmicpc.net/problem/1018

 

1018번: 체스판 다시 칠하기

첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

www.acmicpc.net

 

 

 

<헤맨 과정>

더보기

먼저 직사각형의 크기를 입력받고

입력받은 크기만큼의 char형 2차원 배열을 만들어주었다.

그리고 그 안에 W또는 B을 2차원 크기만큼 입력받게 작성했다.

배열에서 입력받는 과정에 Scanner는 char형으로 받는 메소드가 따로 없어서

한 줄(한 행) 씩 String형으로 입력받고 그것을 2차원 배열의 안쪽 배열에 하나씩 대입하도록 만들어주었다.

그렇게 완성된 직사각형에서 자른 후 색을 바꿔서 8x8의 체스판을 만들도록 할 때 최소로 색을 바꾸는 경우를 찾아주기 위해서

배열안에서 만들 수 있는 모든 8x8을 조사하는 코드를 짜고 그 안에서 1행1열의 색이  B일 경우와 W일 경우로 나눠주었다.

그리고 B경우와 W경우에서 몇 개의 색깔을 바꿔야하는지 각각 카운트 해주고

한개의 체스판을 다 확인하면 더 작은 값을 최솟값을 구할 변수에 넣어주었다.

그리고 계속 이 과정을 반복하면서 이전의 최솟값, B경우, W경우 중 더 작은 값을 찾아주었다.

 

논리적으로는 정상적으로 잘 동작하는 코드를 짰는데

백준에서 돌려보니까 런타임 에러가 났다..

그래서 고민하다가 나중에 풀어야지 하고 두고 어제 다시 잡아봤다.

오랜만에 푹자고 맑은 정신에서 코드를 보니까

바로바로 틀린 부분이 눈에 보였다.

한시간씩 이거만 봐도 안보이더니 나중에 보니까 바로 에러를 찾아내다니...

직사각형의 크기를 입력받는 순서를 잘못 알고 있었고,

체스판의 한 줄이 바뀔 때마다 B와 W가 바뀌는 것을 안짰다.

이것만 고치니까 바로 맞았습니다! 가 떴다.

 

전에 암만해도 못 찾던 에러도 나중에 찾을 수도 있다는 경험을 했다.

코딩할 때 아무리 안 풀려도 포기하지 말자..!

 

 

 

 

<내 최종 코드>

 

https://github.com/WiseJade/Baekjoon-Auto-Push/blob/main/%EB%B0%B1%EC%A4%80/Silver/1018.%E2%80%85%EC%B2%B4%EC%8A%A4%ED%8C%90%E2%80%85%EB%8B%A4%EC%8B%9C%E2%80%85%EC%B9%A0%ED%95%98%EA%B8%B0/%EC%B2%B4%EC%8A%A4%ED%8C%90%E2%80%85%EB%8B%A4%EC%8B%9C%E2%80%85%EC%B9%A0%ED%95%98%EA%B8%B0.java

 

GitHub - WiseJade/Baekjoon-Auto-Push: This is a auto push repository for Baekjoon Online Judge created with [BaekjoonHub](https:

This is a auto push repository for Baekjoon Online Judge created with [BaekjoonHub](https://github.com/BaekjoonHub/BaekjoonHub). - GitHub - WiseJade/Baekjoon-Auto-Push: This is a auto push reposito...

github.com

 

 

 

밑의 글의 가장 하단에 백준과 깃헙을 연동할 수 있 유용한 정보를 작성해놨습니다. 도움이 되길 바랍니다.❤️

 

2022.05.25 - [JAVA/해결한 문제] - baekjoon-1085번 "직사각형 탈출" 회고

 

baekjoon-1085번 "직사각형 탈출" 회고

코딩 독학할 때 백준 가입해놨다가 난이도가 있는 것 같아서 한두문제 풀고 손을 안댔었다. 그러다가 오늘 알고리즘시간에 너무 헤맸어서 알고리즘 연습의 중요성을 느꼈다ㅠㅠ 백준으로 알고

wjcodding.tistory.com

 

 

 

 

 

 

코딩 독학할 때 백준 가입해놨다가

난이도가 있는 것 같아서 한두문제 풀고 손을 안댔었다.

그러다가 오늘 알고리즘시간에 너무 헤맸어서

알고리즘 연습의 중요성을 느꼈다ㅠㅠ

백준으로 알고리즘 연습해서 알고리즘 뇌를 발달시켜야 겠다..🧠

일단 오늘 풀었지만 틀린 문제를 기록으로 남겨놓는다.

 

 

<문제 링크>

 

https://www.acmicpc.net/problem/1085

 

1085번: 직사각형에서 탈출

한수는 지금 (x, y)에 있다. 직사각형은 각 변이 좌표축에 평행하고, 왼쪽 아래 꼭짓점은 (0, 0), 오른쪽 위 꼭짓점은 (w, h)에 있다. 직사각형의 경계선까지 가는 거리의 최솟값을 구하는 프로그램

www.acmicpc.net

 

 

 

<헤맨 과정>

더보기

문제만 보면 직사각형에 좌표 있고 복잡하게 풀어야할 것 같지만

쉽게 접근할 수 있다.

일단 각각 전체 가로세로 길이의 절반보다 (x, y)좌표가 같거나 클 경우를 변수에 담아두었다가 담은 가로, 세로 변수 2개중 더 작은 것을 출력하면 된다.

        if(x >= w / 2) {
            horizon = w - x;
        }
        else horizon = x;

        if(y >= h / 2) {
            length = h - y;
        }
        else length = y;

 

이렇게 조건문을 작성하면 예제의 코드는 잘 돌아가지만

틀렸다.

인텔리제이에서는 잘 돌아가는데 풀이를 제출할 때마다 자꾸 틀렸다고 해서 꽤나 고민했다..

그러다가 혹시 나누기 2 하는 과정에서 int 형이기 때문에 소수점은 버려져서 그런가?

싶어서 테스트 해보니까 그것 때문이었다.

2 3 5 9

이런식으로 입력하면

세로의 변수 length에는 3이 9의 절반인 4.5 보다 작기 때문에 3이 들어가지만

가로는 5의 절반인 2.5와 2를 비교해서 horizon에 2가 들어갈 줄 알았는데

int 형을 나누기 2 했기 때문에 2.5의 소수점을 버린 2와 2를 비교해서 horizon에 5 - 2인 3이 들어간다.

그래서 horizon과 length를 비교한 출력값이 3이 나오게 된다.

 

이럴 때 해결 방법이 2가지가 떠올랐다.

 

1. if문안의 조건문을 double로 형변환한 숫자끼리 비교

        if((double)x >= (double)w / 2) {
            horizon = w - x;
        }
        else horizon = x;

        if((double)y >= (double)h / 2) {
            length = h - y;
        }
        else length = y;

 

 

2. 등호를 없애준다

        if(x > w / 2) {
            horizon = w - x;
        }
        else horizon = x;

        if(y > h / 2) {
            length = h - y;
        }
        else length = y;

 

 

 

<내 최종 코드>

더보기
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int x = sc.nextInt();
        int y = sc.nextInt();
        int w = sc.nextInt();
        int h = sc.nextInt();

        int horizon, length;

        if((double)x < (double)w / 2) {
            horizon = x;
        }
        else horizon = w - x;

        if((double)y < (double)h / 2) {
            length = y;
        }
        else length = h - y;

        System.out.print(Math.min(horizon, length));
    }
}

 

 

 

 

 

🔎 백준의 유용한 기능

 

 

백준과 깃헙 연동하기(백준허브 확장자)

 

크롬 확장자 중에 백준허브를 추가(Add to Chrome)

깃헙 아이디와 Authenticate

Repository 추가 또는 기존 Repository 주소 입력해서 연동

백준에서 문제를 풀고 제출하면 자동으로 내 깃헙 repository에 commit이 됩니다!⭐️

 

 

 

백준 티어 보기

 

백준에는 티어가 존재하는줄 몰랐는데

브론즈, 실버, 골드,... 등 티어가 존재한다.

solved를 이용하면 백준에서 문제의 티어를 볼 수 있다.

 

 

이외에도 백준 티어를 깃헙 프로필에 보이게 할 수도 있다. ㅋㅋ

근데 아직 백준 티어가 브론즈 바닥이라서 나중에 당당하게 티어를 보여줄 만큼 올라갔을 때 깃허브 프로필에 올려야 겠다..

 

 

읽어주셔서 감사합니다.😍

 

 

1