https://www.acmicpc.net/problem/1292
이 문제는 배열을 사용하지 않고 풀 수 있을 것 같아서 풀고 보니 2중 for문에 break를 같은 조건으로 두 번 호출하게 됐다.
break를 같은 조건으로 두 번 호출하는 거 자체도 싫고, 개인적으로 가능하면 2중 for문 보다 for문 1개만 사용하는 거를 선호해서 아래와 같이 풀게 되었다.
배열을 사용하면 배열에 삽입한 후 조회를 해야 해서 2번 사용하게 되다 보니 한 번만 사용해도 되는 방법으로 풀고 싶었다.
Answer
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) {
int A = 0;
int B = 0;
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
A = Integer.parseInt(st.nextToken());
B = Integer.parseInt(st.nextToken());
} catch (IOException e) {
System.err.println("ERROR = " + e.getMessage());
}
System.out.println(calculateSequence(A, B));
}
static int calculateSequence(int A, int B) {
int num = 1;
int count = 0;
int result = 0;
for (int i = 1; i <= B; i++) {
if (i >= A) {
result += num;
}
count++;
if (count == num) {
num++;
count = 0;
}
}
return result;
}
}
Code Review
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
A = Integer.parseInt(st.nextToken());
B = Integer.parseInt(st.nextToken());
} catch (IOException e) {
System.err.println("ERROR = " + e.getMessage());
}
`try-with-resources`로 try에 객체의 자원을 받아서 try문이 끝나면 자동으로 자원을 반환하게 한다.
`System.in`으로 사용자로부터 입력받은 데이터를 바이트 스트림으로 받는다.
`InputStreamReader` 클래스로 바이트 스트림을 문자 기반 스트림으로 변환한다.
`BufferedReader` 클래스로 문자 스트림을 읽는다.
`StringTokenizer` 객체를 생성한다. 이때 인자로는 입력받은 문자열 한 행 `br.readLine()`과 공백 구분자를 넣는다.
`StringTokenizer` 객체의 `nextToken()` 메서드를 사용하여 공백으로 구분된 문자를 하나씩 가져온다.
`Integer.parseInt()` 메서드로 `st.nextToken()` 값을 정수 변환하여 각각 A, B에 대입한다.
System.out.println(calculateSequence(A, B));
생성한 수열 계산 메서드 `calculateSequence()`로 구간에 속하는 숫자의 합을 반환받아서 출력한다.
이때 메서드 인자로는 입력받은 정수 A, B를 넣는다.
static int calculateSequence(int A, int B) {
int num = 1;
int count = 0;
int result = 0;
for (int i = 1; i <= B; i++) {
if (i >= A) {
result += num;
}
count++;
if (count == num) {
num++;
count = 0;
}
}
return result;
}
정수 `num`, 정수의 개수를 셀 `count`, 구간에 속하는 숫자의 합을 구할 `result` 를 선언한다.
for문으로 자연수 1부터 B까지 로직을 반복한다.
예를 들어, A=3, B=7일 경우
num | i | result (A = 3) | count | count == num |
1 | 1 | (1 >= 3 : false) 0 |
0 -> 1 | (true) num : 1 -> 2 count : 1 -> 0 |
2 | 2 | (2 >= 3 : false) 0 |
0 -> 1 | (false) |
2 | 3 | (3 >= 3 : true) 2 |
1 -> 2 | (true) num : 2 -> 3 count : 2 -> 0 |
3 | 4 | (4 >= 3 : true) 5 |
0 -> 1 | (false) |
3 | 5 | (5 >= 3 : true) 8 |
1 -> 2 | (false) |
3 | 6 | (6 >= 3 : true) 11 |
2 -> 3 | (true) num : 3 -> 4 count : 3 -> 0 |
4 | 7 (B = 7) | (7 >= 3 : true) 15 |
0 -> 1 | (false) |
즉, "1 2 2 3 3 3 4 4 4 4 5 ..." 와 같은 수열에서 3번째의 2부터 7번째인 4까지의 합을 구하면 된다.
Result