알고리즘 문제 풀기
[백준 1193번] 분수찾기 (java)
Solu-
2021. 4. 15. 15:02
나의 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
//String s = ""; // 입력받는 문자열
int x = 1; // 1 ≤ X ≤ 1,000,000,000
int result = 0;
int lineNumber = 0;
int sum = 0; // sum = 1 + 2 + 3 + ... + lineNumber까지의 합
boolean flag = true;
int row = 0; // 열
int col = 0; // 행
try {
//s = bf.readLine();
x = Integer.parseInt(bf.readLine());
} catch (IOException e) {
System.out.println(e);
}
// 배열의 대각선의 합은 일정함.
// 이를 통해서 위치 값을 알아내기로 하였음
// X가 어디에 있는지 좌측부터 lineNumber 번째 대각선 중에 찾아냄
while(true) {
lineNumber++;
sum += lineNumber;
if (x <= sum) {
break;
}
}
// 대각선의 방향에 따라 달리 계산
if (lineNumber % 2 == 0) {
// 짝수일 때 == 남서쪽으로 진행하는 경우
col = sum - x;
row = (lineNumber - 1) - col;
}
else {
// 홀수일 때 == 북동쪽으로 진행하는 경우
row = sum - x;
col = (lineNumber - 1) - row;
}
// index 기준으로 계산했으므로, 문제 결과에 맞게 각각 1씩 더함
System.out.println(++row + "/" + ++col);
}
}
0,0 부터 N,N까지의 index로 생각하고 문제를 풀었다. 문제에서는 1/1부터 시작하기 때문에 헷갈리면서 풀었다.
각 위치마다 대각선을 그었을 때, 각 row와 col 합은 일정하다. 이것을 이용하여, x가 몇 번째 대각선의 위치에 있는지 확인한다.
lineNumber = 0; // 좌표 : (0,0) // x = 1
lineNumber = 1: // 좌표 : (0,1), (1,0) // x = 2, 3
lineNumber = 2; // 좌표 : (0,2), (1,1), (2,0) // x = 4, 5, 6
lineNumber가 1씩 증가할 때, x의 위치는 (1 + 2 + ... + lineNumber) 와 (1 + 2 + ... + lineNumber + (lineNumber + 1)) 사이에 있다.
이를 이용하여, X가 위치하는 대각선을 찾고, 대각선의 진행 방향(lineNumber가 짝수/홀수에 따라 진행방향이 다르다)에 따라 좌표 값을 계산해 주었다.
내가 생각한 다른 사람 모범 답안
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuffer sb = new StringBuffer();
int n = Integer.parseInt(br.readLine());
int a = 1;
while(n > a) {
n -= a++;
}
if(a % 2 == 0) {
sb.append(n).append("/").append(a+1 -n);
}else {
sb.append(a+1 -n).append("/").append(n);
}
bw.write(sb.toString());
bw.flush();
br.close();
bw.close();
}
}
a라는 변수를 통해 같은 방식으로 처리한듯 하다. 다만, s코드가 더 간결하고 실행 속도도 빠르다.
실행 결과
- 내 코드 : 165ms
- 모범 답안 : 128ms