본문 바로가기

[BOJ] - JAVA

(173)
[백준] 1373 : 2진수 8진수 JAVA 풀이 처음에는 2진수를 10진수로 변환하고 메서드로 8진수로 변환한 값을 출력하면 되겠다! 했는데 틀렸다.. 입력조건을 전혀 고려하지 않았기 때문이었다 하하 입력되는 수의 길이가 최대 999999인데 2^999999를 담을 수 있는 자료형이 없다는 게 문제였다. 그래서 정석대로 3자리씩 잘라서 8진수로 변환하는 방법으로 변경했다. import java.io.*; import java.util.*; public class bj_1373 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuffer sb = ne..
[백준] 2745 : 진법 변환 JAVA 풀이 이전에 풀었던 11005번에서 내용을 뒤집은 것 같은 문제였다. 다음과 같은 순서로 금방 해결할 수 있었다. 1. N과 B를 입력받는다. 이때 N은 String으로 B는 int로 입력받았다. 2. B진법에서 10진법으로 변환한 값을 저장할 변수 result를 생성한다. 3. 입력받은 N의 순서를 뒤집기 위해서 StringBuffer 변수 rev를 생성한다. StringBuffer.reverse() 메서드를 사용해 N의 내용을 뒤집은 것을 rev에 저장한다. 4. rev의 길이(=N의 길이)만큼 반복문을 실행한다. 4-1. char c = rev.charAt(i)으로 rev에 저장된 값을 한 글자씩 c에 저장한다. 4-2. c가 아스키코드 0 ~ 9 라면 c - '0'한 값을 int로 캐스팅하고, B의 i..
[백준] 11005 : 진법 변환 2 JAVA 풀이 뭔가 익숙한 듯 낯선 문제였다. 1. N과 B를 입력받는다. 2. 진법변환한 값을 저장할 스트링빌더를 생성한다. 3. N이 0보다 클 동안 반복문을 실행한다. 3-1. (N%B)가 0 ~ 9의 값이라면 (N%B)에 + '0'을 해 아스키코드 값으로 바꾼다. 이 값을 char형으로 변환해서 스트링빌더에 추가한다. 3-2. (N%B)가 10이상의 값이라면 (N%B)에서 10을 빼고 + 'A'를 한 값을 스트링빌더에 추가한다. 3-3. N을 B로 나눠준다. 4. 스트링빌더의 내용을 역순으로 출력한다. import java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws IOException{ B..
[백준] 9613 : GCD 합 JAVA 풀이 자료형을 주의해야 하는 것만 빼면 간단한 문제였다. 만약 한 테스트케이스가 100개의 수로 이루어져 있으면 그 순서쌍의 개수만 해도 아주 커진다. 그렇기 때문에 그 모든 순서쌍의 합인 sum의 자료형은 long으로 선언하는 것이 바람직하다. 1. 테스트케이스의 개수 T를 입력받는다. 2. T개의 테스트케이스를 한 줄씩 입력받는다. 3. 테스트케이스의 내용 중 첫 번째 값인 n이 한 테스트케이스를 구성하는 숫자의 개수다. 4. n개의 수를 입력받아 ArrayList에 저장한다. 5. gcd를 구하는 메서드를 작성한다. 5. 이중 반복문으로 모든 순서쌍을 gcd 메서드에 인사로 넘겨주고, gcd의 합을 구한다. 6. 각 테스트케이스의 gcd 합을 출력한다. import java.io.*; import jav..
[백준] 1850 : 최대공약수 JAVA 풀이 A와 B를 구성하는 1의 개수가 입력된다. 이때 입력되는 수는 2^63-1까지라서 long으로 입력받아야 한다. 입력된 수만큼 1을 반복한 수들의 최대공약수를 구하면 되겠지.라고 생각하기 쉽지만 여기서 문제가 발생할 수 있다. 만약 2^60이 입력된다면, 1을 2^60번만큼 반복한 수를 담을 수 있는 자료형은 존재하지 않는다. 예제 입력 3번이 여기에 해당한다. 그럼 어떻게 해야 하는가.. 예제 입력을 잘 보면 규칙을 찾을 수 있다. 3과 4의 최대공약수는 1이고 111과 1111의 최대공약수는 1이다. 3과 6의 최대공약수는 3이고 111과 111111의 최대공약수는 111이다. 500000000000000000 500000000000000002의 최대공약수는 2이다. 1이 500000000000000..
[백준] 1934 : 최소공배수 JAVA 풀이 바로 이전에 올렸던 2609번을 푼 사람이라면 아주 쉽게 풀 수 있는 문제다. 핵심은 이것 숫자 A와 B가 있고, r을 A % B라고 했을 때 ( A >= B ) 최대공약수 GCD(A,B) = GCD(B,r) 그리고 A = ad, B = bd (a와 b는 서로소이고, d는 A와 B의 최대공약수)라고 했을 때 A와 B의 최소공배수는 abd이다. 따라서 A와 B가 주어지고 둘의 최대공약수인 d를 구한다면 AB = adbd 이니 이것을 d로 나눠주면 최소공배수를 구할 수 있다. import java.io.*; import java.util.*; public class Main{ public static void main(String[] args)throws IOException{ BufferedReader b..
[백준] 2609 : 최대공약수와 최소공배수 처음엔 이렇게 풀었는데 특정 입력에서는 통하지 않아서 오답처리가 됐다. import java.io.*; import java.util.*; public class Main{ public static void main(String[] args)throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int A = Integer.parseInt(st.nextToken()); int B = Integer.parseInt(st.nextToken()); int GCD = 1, LCM = 1; while(..
[백준] 10799 : 쇠막대기 JAVA 풀이 문제를 읽고 어떻게 풀어야 하는지 전혀 감이 오지 않았다.... 우선 문자열을 입력을 받는다. 문자열을 구성하는 문자는 '(' 또는 ')' 이다. 1. '('가 입력된 경우에는 스택에 push해준다. 2. ')'가 입력된 경우는 두 가지 케이스로 다시 나눠볼 수 있다. 2-1. 이전 문자가 '('일 경우, 즉 레이저인 경우 스택에 있던 '('를 pop하고 스택의 크기(= 쇠막대기의 개수)만큼 더해준다. 2-2. 이전 문자가 ')'일 경우, 즉 한 막대기의 끝일 경우 스택에 있던 '('를 pop하고 1을 더해준다. 한 막대기의 끝을 나타내는 ')'일 경우 1을 더해주는 이유는 위 그림을 보면 이해가 갈 것이다. 그 막대는 더 이상 쪼개질 일이 없기 때문에 그 마지막 조각의 개수인 1을 더해주는 것이다. i..