Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 탐색알고리즘
- codeground
- Algorithm
- Database
- 프레임워크
- react
- 우아한형제들
- BOJ
- 단위테스트
- DFS
- 데이터베이스
- SQL
- TypeScript
- BAEKJOON
- framework
- Vue.js
- 연습문제
- Spring
- 우아한테크캠프
- mobx
- springboot
- JavaScript
- BFS
- 백준
- 알고리즘
- Java
- Vue
- JPA
- 웹프로그래밍
- Backtracking
Archives
- Today
- Total
설모의 기록
[백준 14919] 분포표 만들기 본문
이 문제는 1 / m 만큼씩 1을 나눠 구간을 만들고 그 다음으로 주어지는 숫자들을 그 구간별로 나눈 후, 구간별로 몇 개의 숫자가 존재하는지 출력하는 문제입니다. 쉽다고 생각하고 몇번이나 코드를 제출했지만 계속 '틀렸습니다' 만 반복해서 대체 왜 그러는건가 double 에 대해 찾아봤습니다. 알게된 내용은 다음과 같습니다.
컴퓨터가 숫자를 처리할 때에는 1.xxxxx(지수부) * 2^(가수부) 로 인식하기 때문에 2의 배수가 아니거나 소수인 값은 내가 저장한 값이 그대로 저장되지 않는 경우가 있다고 합니다. 이 상황에서 오차가 발생하기 때문에 그 오차를 해결하는 과정을 확인하기 위한 문제였다고 볼 수 있습니다. 예를 들어, double a = 0.1; 이러한 코드를 작성하였다 해도 a에는 0.1 이 아니라 0.1000000001 와 같은 값이 저장될 수 있다고 합니다. 따라서 이 오차를 해결하기 위해서 아래의 코드에서 0.0000000001 값을 더했습니다.
또한 각 구간이 T로 나눈 값이기 때문에 각 부등식에 T를 곱하면 계산이 수월해집니다. 따라서 입력값에 0.0000000001 를 더한 후 T를 곱한 뒤 int형으로 타입캐스팅을 하면 정수부분만이 나옵니다. 즉, 배열의 인덱스 값이 나오게 되는 것이죠. 그래서 이 인덱스에 1씩 더해주면 그 구간에서의 숫자의 개수가 되게 됩니다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.io.BufferedReader; | |
import java.io.IOException; | |
import java.io.InputStreamReader; | |
import java.util.StringTokenizer; | |
public class boj6603 { | |
static int T; | |
static int[] list; | |
static boolean[] visited; | |
static StringBuilder sb; | |
public static void main (String[] args) throws IOException { | |
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); | |
while (true) { | |
StringTokenizer st = new StringTokenizer(br.readLine()); | |
T = Integer.parseInt(st.nextToken()); | |
if (T == 0) break; | |
list = new int[T]; | |
visited = new boolean[T]; | |
sb = new StringBuilder(); | |
for (int i = 0; i < T; i++) { | |
list[i] = Integer.parseInt(st.nextToken()); | |
} | |
calculate(0, 0); | |
System.out.println(sb); | |
} | |
br.close(); | |
} | |
private static void calculate (int v, int length) { | |
if (length == 6) { | |
for (int i = 0; i < T; i++) { | |
if (visited[i]) sb.append(list[i] + " "); | |
} | |
sb.append("\n"); | |
return; | |
} | |
if (v >= T) return; | |
visited[v] = true; | |
calculate(v + 1, length + 1); // 이번 인덱스를 포함하는 경우 | |
visited[v] = false; | |
calculate(v + 1, length); // 이번 인덱스를 포함하지 않는 경 | |
} | |
} |
'알고리즘' 카테고리의 다른 글
[백준1987] 알파벳 (0) | 2018.05.04 |
---|---|
[백준 1012] 유기농 배추 (0) | 2018.05.02 |
[백준 6603] 로또 (0) | 2018.05.02 |
[백준 1389] 케빈 베이컨의 6단계 법칙 (0) | 2018.05.02 |
[백준 14500] 테트로미노 (4) | 2018.04.15 |