JAVA (12)

 

 

 

 

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

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

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

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

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

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

 

 

<문제 링크>

 

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를 이용하면 백준에서 문제의 티어를 볼 수 있다.

 

 

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

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

 

 

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

 

 

 

문제

 

문자열을  입력받아 문자열을 구성하는 각 문자를 key로 갖는 hashMap을 리턴하는 메소드 만들기

 

 

해결

 

public HashMap<Character, Integer> countAllCharacter(String str) {
        // 문자열이 비어있을 경우 null 리턴
        if (str.isEmpty()) {
            return null;
        }
        
        // 반환할 hashMap 생성
        HashMap<Character, Integer> result = new HashMap<>();
        // 매개변수의 문자열을 char형 배열로 변환
        char[] charArray = str.toCharArray();
        // Arrays.sort()를 이용하여 char 배열을 알파벳 순으로 정렬
        Arrays.sort(charArray);
        
        // char형 배열의 요소를 하나씩 꺼내기
        // 향상된 for문 이용
        for (char c : charArray) {
        	// 중복될 경우 해당 key의 value 값에 +1
            if (result.containsKey(c)) {
                result.put(c, result.get(c) + 1);
            } else {
            	// 중복되지 않을 경우 key와 value 1을 hashMap에 추가
                result.put(c, 1);
            }
        }
        return result;
}

 

 

 

해결하기 전까지의 과정

 

처음에는 String을 char형 배열로 만든 다음 배열 내에서 중복을 체크하고

중복되면 value에 +1 해준 후 배열의 해당 중복된 문자 하나를 지운 후 한 칸씩 왼쪽으로 이동해주는 코드를 작성했다.

하지만 오류가 많고 문제가 배열의 길이를 축소할 방법이 없었다.

 

그 다음에 생각한 방법이 char형 배열을 ArrayList<Character> 형으로 만드는 방법이었다.

중복된 문자를 ArrayList의 메소드인 remove()를 이용해서 하나 제거하고 value에 +1 해주는 방법으로 했다.

이렇게 해도 함수에서 반환받은 hashMap이 index 초과 오류가 발생했다.

 

전부 지우고 빈 화면에서 곰곰히 생각하다가 겨우 생각났다. 😔

char형 배열로 옮긴 다음에

문자를 하나씩

hashMap의 containsKey() 메소드를 이용해서 hashMap안에 중복되 있는지 확인하고

중복되면 해당 문자 key에 value 값을 +1 하고

중복되지 않으면 map안에 없는 것이니까 새로 맵에 붙여 주면 된다.

고민하고 헤맨 것에 비해 너무 간단하고 한순간에 해결됐다.. 

계속 방법이 생각이 안나다가 머리속에 벼락맞은 것처럼 한순간에 생각났다. ㅋㅋㅋ

 

 

 

 

 

1 2