-
[백준 1193번] 분수찾기 (java)알고리즘 문제 풀기 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
'알고리즘 문제 풀기' 카테고리의 다른 글
[프로그래머스 60057] 문자열 압축 (java) (0) 2021.04.21 [프로그래머스 12899] 124 나라의 숫자 (java) (0) 2021.04.20 [백준 2869번] 달팽이는 올라가고 싶다 (java) (0) 2021.04.19 [백준 2775번] 부녀회장이 될테야 (java) (0) 2021.04.16 [백준 10250번] ACM 호텔 (java) (0) 2021.04.16