-
728x90
입출력 - 2557, 1000, 2558, 10950, 10951, 10952, 10953, 11021, 11022, 11718, 11719, 11720, 11721, 2741, 2742, 2739, 1924, 8393, 10818, 2438, 2439, 2440, 2441, 2442, 2445, 2522, 2446, 10991, 10992
출처: https://plzrun.tistory.com/entry/알고리즘-문제풀이PS-시작하기 [plzrun's algorithm]change Nxxxx -> Main && remove package lines!!!
이클립스에서 작성하면서 문제 이름으로 클래스를 생성하여 풀었기 때문에
클래스 이름을 Main으로 바꾸고, package 부분도 지우고 제출해야 정상적으로 돌아갑니다.
<풀이>
123456789101112131415161718192021222324252627282930313233343536373839package io;public class N10992 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();for(int p=0; p<n-1; p++) {System.out.print(" ");}System.out.print("*");System.out.println("");for(int p=0; p<n-2; p++) {for(int q=0; q<n-p-2; q++) {System.out.print(" ");}System.out.print("*");for(int q=0; q<2*p+1; q++) {System.out.print(" ");}System.out.print("*");System.out.println("");}if(n!=1) {for(int p=0; p<2*n-1;p++) {System.out.print("*");}}}}문제를 보면 겉으로는 이전까지 풀었던 별 찍기 문제와 굉장히 유사해 보이는데,
개인적으로는 처음 접근할 때 좀 당황스러웠다.
처음 직관적으로 들었던 생각은 마지막 행만 따로 코딩해주고 이전의 10991번 문제와 유사하게 코딩을 하면 되지 않을까 싶었는데,
문제는 1행을 제외한 2~n-1행까지(n=입력 값) 별을 두 개만 찍는다는 것이었다.
여기에 if문을 사용해서 처리할 수도 있었겠지만, 문제를 다르게 접근했다.
이미 마지막 행을 따로 코딩할 생각을 하고 있었기때문에, 첫 행도 따로 코딩을 해주기로 한 것이다.
즉, 문제를 세 부분으로 나눠 접근했다.(이런 접근 방식을 Divide & Conquer =분할정복 기법이라고 불렀던 것 같다.)
첫 행, 2~(n-1)행, 마지막 행.
이렇게 접근하니 어렵지 않게 문제가 해결되었다.
딱 하나의 사소한 문제만 빼고...
(n=1, 1을 입력했을 때 마지막 행을 따로 코딩한 부분에서 무시해버려야 하는데 별 하나를 찍어버렸다.)
물론 이런 예외 case를 처리하기 위해 if문 하나를 추가해주면서 간단히 처리할 수 있었다.
겉으로 보기에는 이전 10991번 문제와 굉장히 유사한 출력을 내뱉는데
코딩은 전혀 다르게 하다보니, 참 신기하다.
다른 분들의 풀이도 궁금해서 구글링을 통해 찾아봤는데 if문을 많이 활용하신 분들이 많았는데
결과적으로는 그 분들의 코드가 훨씬 간결해보였다.
Github: https://github.com/jaeuk9407/AlgorithmBOJ
'Algorithms' 카테고리의 다른 글
[백준 알고리즘] (DP) 11726번 Java 풀이 (0) 2020.03.11 [백준 알고리즘] (DP) 1463번 Java 풀이 (0) 2020.03.10 [백준 알고리즘] (I/O) 10991번 Java 풀이 (0) 2020.03.09 [백준 알고리즘] (I/O) 2446번 Java 풀이 (0) 2020.03.09 [백준 알고리즘] (I/O) 2522번 Java 풀이 (0) 2020.03.09 댓글