관리 메뉴

JumpUp

백준 [N2438 - 별찍기1], [N2442 - 별찍기5] 본문

알고리즘

백준 [N2438 - 별찍기1], [N2442 - 별찍기5]

yeunnnn 2021. 11. 2. 22:04
구현문제


별찍기 - 1 (오류1 - 메모리 초과)

String 객체는 immutable(객체가 한 번 할당되면, 해당 객체의 참조를 변경할 수도, 내부의 상태를 수정할 수도 없는 것이다.)하기 때문에 += 을 할 때마다 기존의 내용을 모두 복사해서 새로운 객체를 만들고, 그 뒤에 문자열을 이어붙여야 합니다. 기존의 객체는 쓸모가 없어지므로 버려져야 하는데 이게 메모리에서 실제로 해제되기까지는 시간이 걸리는 것으로 보입니다. 설령 메모리 문제가 해결된다고 하더라도 시간 초과가 뜰 것입니다.
String 대신에 StringBuilder를 사용하면 잘 통과됩니다.
출처 : https://www.acmicpc.net/board/view/33919
String star = "*";
for(int i=1;i<=n;i++){
      for(int j=1;j<=i;j++){
           output += star;
       }
       bw.write(output+"\n");
}

Solution

StringBuilder sb = new StringBuilder();
        for(int i=1;i<=n;i++){
            for(int j=1;j<=i;j++){
                sb.append("*");
        }
        sb.append("\n");
 }

 


 

별찍기 -2 (문제이해)

별찍기5 예제출력1

위와 같이 별이 마지막으로 찍힌 뒤에는 다음 줄로 넘어간다.

(하지만,,별이 마지막으로 찍힌 뒤에도 마지막 줄 별의 수 만큼 공백을 채워준다고 생각했다. 그래서 이중포문에 break를 걸어 다음줄로 넘어가도록 했다)

public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        br.close();

        StringBuilder sb = new StringBuilder();
        for(int i=n-1;i>=0;i--){
            for(int j=1;j<=n*2-1;j++){
                if(j>=n*2-i) break;
                if(j<=i) sb.append(" ");
                else sb.append("*");
            }
            sb.append("\n");
        }
        System.out.print(sb);
    }
}

문제를 바르게 이해한 후 직관적으로 수정한 코드는 아래와 같다.

Solution

public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        br.close();

        StringBuilder sb = new StringBuilder();
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n-i;j++){
                sb.append(" ");
            }
            for(int j=0;j<i*2-1;j++){
                sb.append("*");
            }
            sb.append("\n");
        }
        System.out.print(sb);
    }
}

 

 

728x90

'알고리즘' 카테고리의 다른 글

백준 [N1697 - 숨바꼭질]  (0) 2021.11.17
백준 [N2696 - 중앙값구하기]  (0) 2021.11.06
프로그래머스 [타겟넘버]  (0) 2021.10.18
프로그래머스 [N으로 표현]_DP  (0) 2021.10.04
MST알고리즘 - 크루스칼(Kruskal)  (0) 2021.09.27