-
모각코 PS / 백준 1475 방 번호PS 2022. 5. 25. 15:57
모각코 PS스터디
이번주는 지난주와 비슷한 난이도의 문제가 선정되었습니다. 아직 2번 문제까지밖에 못봤는데 오늘 남는 시간에 나머지도 얼른 풀어봐야겠어요. 그 전에, 먼저 풀어놓은 문제들부터 포스팅으로 남겨보려고 합니다.
문제와 풀이
문제 링크 : 백준 1475번 - 방 번호
👇펼쳐서 코드와 해설 읽기
로직의 흐름은 이렇습니다.
0
9까지의 숫자세트를 저장할 배열 변수 set을 만들어놓습니다.9까지 하나씩 증가)하고 난 뒤에 잔여개수를 줄입니다.
입력받은 숫자열(int)의 길이를 체크해서, 길이만큼 for문을 돌 건데요.
한 바퀴 돌 때마다 앞에서부터 숫자 하나씩 가져옵니다.
가져온 숫자가 숫자세트에 존재하는지 체크합니다.
있으면 숫자세트의 잔여 개수를 하나 줄입니다.
줄일 잔여 수가 없으면
숫자세트를 하나 추가(0
숫자세트를 늘렸으니 카운트합니다.
그런데 이번에 가져온 숫자가 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; } } }
마무리
문제 자체는 크게 어려운 점은 없으나, 조금 색다르게 해보려고 각 로직들을 메서드로 추출해보았습니다.
스터디 중에 문제 풀이를 말로 설명할 때 슉슉 지나가면, 설명을 들으면서 코드 보시는 분들은 헷갈리실 것 같더라고요. 읽으시는 속도가 제 말보다 훨씬 느리니까요. 어느 순간 설명을 놓치시는 것 같았습니다(말을 천천히 해도 되겠지만 성격이 급해서...).
그래서 메인 로직과 상관없는 단순 기능들은 메소드로 추출하고, '여기서 어떠어떠한 기능이 필요해서 수행했다' 하는 것이 명확하게 드러나도록 메서드명을 지어서, 이곳에서 뭘 하는 코드인지 읽는 사람이 빠르게 파악할 수 있도록 노력해보았습니다.
메인 로직을 가리지 않을 정도로만 메서드를 추출하는 과정(이 정도면 보는 사람이 금방 이해할 수 있을까?를 생각하는 과정)이 꽤 재밌었습니다.
소감 끝!
'PS' 카테고리의 다른 글
동전 교환 알고리즘: 주어진 화폐로 특정 금액 만드는 경우의 수 구하기 (0) 2022.06.02 모각코PS / 프로그래머스 Lv2 소수 찾기 (2) 2022.05.28 모각코PS / 백준 17478 재귀함수가 뭔가요? (0) 2022.05.25 PS미세먼지 팁: 정수 자릿수 구할 때 Math.log10() + 1? (2) 2022.05.24 모각코 PS / 카카오 2020 신입 블라인드 채용 1차 문자열 압축 (0) 2022.05.21 모각코 PS스터디 / 백준 1783 병든 나이트 (0) 2022.05.21