ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 모각코 PS / 백준 1475 방 번호
    PS 2022. 5. 25. 15:57

    모각코 PS스터디

    이번주는 지난주와 비슷한 난이도의 문제가 선정되었습니다. 아직 2번 문제까지밖에 못봤는데 오늘 남는 시간에 나머지도 얼른 풀어봐야겠어요. 그 전에, 먼저 풀어놓은 문제들부터 포스팅으로 남겨보려고 합니다.

    문제와 풀이


    문제 링크 : 백준 1475번 - 방 번호

    👇펼쳐서 코드와 해설 읽기

    로직의 흐름은 이렇습니다.

    09까지의 숫자세트를 저장할 배열 변수 set을 만들어놓습니다.
    입력받은 숫자열(int)의 길이를 체크해서, 길이만큼 for문을 돌 건데요.
    한 바퀴 돌 때마다 앞에서부터 숫자 하나씩 가져옵니다.
    가져온 숫자가 숫자세트에 존재하는지 체크합니다.
    있으면 숫자세트의 잔여 개수를 하나 줄입니다.
    줄일 잔여 수가 없으면
    숫자세트를 하나 추가(0
    9까지 하나씩 증가)하고 난 뒤에 잔여개수를 줄입니다.
    숫자세트를 늘렸으니 카운트합니다.
    그런데 이번에 가져온 숫자가 6 || 9라면, 각각 서로를 대체해줄 수 있기 때문에 잔여 개수를 체크할 때 해당 숫자(예를 들어 6)가 없으면, 나머지 숫자(예: 9)의 잔여 개수도 체크합니다.
    추가하고 제외하고 카운트 하는 것은 나머지 숫자들과 동일합니다.
    카운트를 출력하고 마칩니다.

    import java.util.Scanner;
    
    public class Main {
    
       public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int input = scanner.nextInt();
            scanner.close();
            int length = String.valueOf(input).length();
            int n = length;
    
            int[] set = new int[10];
            int count = 0;
    
            int number;
            for (int i = n; i > 0; i--) {
                number = getNthNumber(input, i);
    
                if (number == 6 || number == 9) {
                    int other = number == 6 ? 9 : 6;
    
                    if (isExhausted(set, number)) {
                        if (isExhausted(set, other)) {
                            addSet(set);
                            count++;
                        }
                        set[other]--;
                    } else {
                        set[number]--;
                    }
                } else {
                    if (isExhausted(set, number)) {
                        addSet(set);
                        count++;
                    }
                    set[number]--;
                }
            }
    
            System.out.println(count);
        }
    
        private static boolean isExhausted(int[] set, int number) {
            if (set[number] == 0) return true;
            return false;
        }
    
        private static int getNthNumber(int input, int n) {
            return (input / pow10byN(n - 1)) % 10;
        }
    
        private static int pow10byN(int n) {
            if (n == 0) {
                return 1;
            }
    
            int result = 10;
            for (int i = 1; i < n; i++) {
                result *= 10;
            }
    
            return result;
        }
    
        public static void addSet(int[] set) {
            for (int i = 0; i < 10; i++) {
                set[i] += 1;
            }
        }
    
    }

    마무리


    문제 자체는 크게 어려운 점은 없으나, 조금 색다르게 해보려고 각 로직들을 메서드로 추출해보았습니다.

    스터디 중에 문제 풀이를 말로 설명할 때 슉슉 지나가면, 설명을 들으면서 코드 보시는 분들은 헷갈리실 것 같더라고요. 읽으시는 속도가 제 말보다 훨씬 느리니까요. 어느 순간 설명을 놓치시는 것 같았습니다(말을 천천히 해도 되겠지만 성격이 급해서...).

    그래서 메인 로직과 상관없는 단순 기능들은 메소드로 추출하고, '여기서 어떠어떠한 기능이 필요해서 수행했다' 하는 것이 명확하게 드러나도록 메서드명을 지어서, 이곳에서 뭘 하는 코드인지 읽는 사람이 빠르게 파악할 수 있도록 노력해보았습니다.

    메인 로직을 가리지 않을 정도로만 메서드를 추출하는 과정(이 정도면 보는 사람이 금방 이해할 수 있을까?를 생각하는 과정)이 꽤 재밌었습니다.

    소감 끝!

    댓글

Designed by Tistory.