본문 바로가기

전체 글

(263)
[백준] 1676 : 팩토리얼 0의 개수 JAVA 풀이 처음에는 n을 입력받고 팩토리얼값을 구한 뒤 뒤에서부터 0의 개수를 세려고 했다. 하지만 n이 커질 경우 BigInteger 클래스를 사용하지 않고서는 담을 수 없는 경우가 발생하게 된다. 그래서 다른 해결방법이 있을 것 같아 서치를 하다 이 포스트를 발견했다. https://st-lab.tistory.com/165 [백준] 1676번 : 팩토리얼 0의 개수 - JAVA [자바] www.acmicpc.net/problem/1676 1676번: 팩토리얼 0의 개수 N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오. www.acmicpc.net 문제 정말 정말 쉬운 문제다. 알고리 st-lab.tistory.com 소인수분해를 했을 때 2와 5가 존재하면 뒷자리..
[백준] 11576 : Base Conversion JAVA 풀이 1. 입력받은 A와 B를 저장한다. 2. N을 저장한다. 3. A진수로 입력되는 N자릿수의 숫자를 10진수로 바꾼 값을 저장할 sum을 생성한다. 4. N자리의 A진수 값들을 10진수로 바꿔 sum에 더한다. 5. sum을 B진수로 바꾼 값을 각 자리수별로 저장할 ArrayList인 list를 생성한다. 6. sum을 B진수로 바꾼 값을 list에 한 자리씩 저장한다. 7. list에 저장된 값을 역순으로 출력한다. import java.io.*; import java.util.*; public class Main{ public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new Inp..
[백준] 1212 : 8진수 2진수 JAVA 풀이 Integer.toBinaryString()메서드는 Integer를 2진수로 바꿔주는데, 3일 경우는 011이 아니라 11로 바꿔준다. 이 문제에서는 8진수를 2진수로 바꿔야 하므로 변환된 값이 세 자리가 아닌 경우에는 앞에 0을 붙여줘야 한다. 그리고 수가 0인 경우를 제외하고는 반드시 1로 시작해야 한다는 조건도 주의해야 한다. 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)); String str = br.rea..
[백준] 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..