본문 바로가기
PS/BOJ

[자바] 백준 25314 - 코딩은 체육과목 입니다 (java)

by Nahwasa 2022. 7. 30.

 문제 : boj25314


 

필요 알고리즘 개념

  •  입력받기, 반복문
    • 숫자를 입력받을 수 있고, 반복문을 사용할 수 있다면 풀 수 있다.

※ 제 코드에서 왜 main 함수에 로직을 직접 작성하지 않았는지, 왜 Scanner를 쓰지 않고 BufferedReader를 사용했는지 등에 대해서는 '자바로 백준 풀 때의 팁 및 주의점' 글을 참고해주세요. 백준을 자바로 풀어보려고 시작하시는 분이나, 백준에서 자바로 풀 때의 팁을 원하시는 분들도 보시는걸 추천드립니다.

 


 

풀이

  사실 같은 브론즈5인 1000번 A+B에 비해선 많이 어렵다(?). N을 입력받아 숫자로 변경해야 하고, 그걸 4로 나눠야 하며 반복문을 통해 N/4번 "long "을 출력해준 후 "int"를 출력해줘야 한다.

  

  알고리즘적으로는 딱히 설명할게 없다. 이하 코드에서 설명할 만한 부분들은 왜 solution 함수에 작성했는지, BufferedReader는 왜 쓴건지.. 이런 부분들인데 그건 위에 '필요 알고리즘 개념'쪽에 링크 걸려있는 '자바로 백준 풀 때의 팁 및 주의점'을 참고해보자.

 

  내 경우엔 StringBuilder를 사용해 문자열을 붙여서 한번에 출력해줬다. 하지만 일반적으로는 그냥 바로바로 System.out.print()를 해줘도 된다. 주의점은 System.out.println()은 ln이 line의 의미로 개행문자를 뒤에 붙인걸 출력한다. 따라서 이 문제에서 long long long... int 처럼 붙이려면 ln을 뺀 System.out.print()를 사용해줘야 한다. StringBuilder를 쓴 이유는 더 빨라서이다.

 

  TMI. 자바에서 String은 애초에 final 객체이다.

  즉 "long " + "long "처럼 String 끼리의 '+' 해준다면, 처음 "long "이 String 하나, 그 다음 "long "도 String 하나(실제론 String.intern()을 통해 저렇게 리터럴로 작성한건 하나의 String이긴 하지만, 일단 개념적으로 설명하고 있다.), 합쳐진 "long long "도 또 다른 String이 된다. 그럼 "long "을 100번 출력해야 한다면 ? 대략 스트링 199개가 생성된다(실제론 intern 때문에 100개정도긴 하다). 메모리도 비효율적이고 매번 붙일 때 마다 모든 character를 읽어야 하므로 시간도 오래걸린다.

 

  반면에 StringBuilder는 애초에 배열로 되어있다. (같은 제품으로 StringBuffer도 있다. thread-safe의 차이이다.)

  따라서 여러 String이나 클래스들을 합쳐야할 경우, String에 합치는 것 보다 월등하게 StringBuilder를 사용하는게 더 빠르다. 즉, 매번 새로 붙인걸 만드냐 vs 애초에 가변형으로 만들어 붙이냐의 차이이다.

 


 

코드 : github

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    private void solution() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n/4; i++) {
            sb.append("long ");
        }
        sb.append("int");
        System.out.println(sb);
    }
    public static void main(String[] args) throws Exception {
        new Main().solution();
    }
}

댓글