반응형

Category 169

[백준_BOJ] 2577. 숫자의 개수 _ JAVA

문제 풀이 먼저 A, B, C 세 정수를 입력받습니다. 입력 받은 A * B * C 의 결과를 result에 문자열 형태로 저장하였습니다. result에서 숫자 하나씩 떼어 0 ~ 9로 이루어진 배열에 해당 숫자를 1씩 카운트 해주었습니다. 나중에 계수 정렬 (counting sort)에 대해 배운다면 자주 사용하게 될 기법이니 익혀두시길 바랍니다. 주의할 점은 result는 String 형태이므로 숫자 하나씩 떼어낸다면 떼어낸 숫자는 int형이 아니라 char형태입니다. 따라서 array[result.charAt(i)] 가 아닌 array[result.charAt(i)-'0']로 해주셔야 정확한 배열의 위치로 찾아갈 수 있습니다. 카운팅이 모두 끝난 후 0부터 9까지 for문을 이용해 차례대로 출력해주..

알고리즘 연습 2019.12.28

[백준_BOJ] 2920. 음계 _ JAVA

문제 풀이 입력되는 8개의 숫자가 ascending의 형태인지, descending의 형태인지, mixed인지를 판별하는 문제입니다. array라는 이름의 8개의 int형 공간의 배열을 만들어주었고 가장 먼저 첫 번째 숫자가 1이라면 ascending인지를 검사하고, 첫 번째 숫자가 8인 경우에는 descending인지의 여부를 검사하였습니다. for문을 이용해서 계속 증가 혹은 계속 감소하는지의 여부를 검사하다가 일치하지 않는 경우에는 "mixed"를 출력하고 종료하도록 해주었습니다. 사실 이 문제 같은 경우는 단순히 입력되는 문자열로 판별해도 되는 문제입니다. 경우의 수가 3가지 밖에 없기 때문이죠 이렇게 풀이하셔도 문제없이 통과하실 수 있습니다! 코드 출처 https://www.acmicpc.net..

알고리즘 연습 2019.12.28

[백준_BOJ] 2562. 최댓값 _ JAVA

문제 풀이 입력되는 9개의 숫자 중에서 최댓값을 찾는 문제입니다. array라는 이름의 int형 10개 공간의 배열을 만들어주었고 입력 받으면서 현재까지 나온 숫자들 중에서 가장 큰 값이라면 max변수에 담아주었고 그때의 i값을 index에 저장해두었습니다. i번째와 index값을 일치시키기 위해 for문은 1부터 9까지 진행하도록 설정하였습니다. 코드 출처 https://www.acmicpc.net/problem/2562 2562번: 최댓값 9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오. 예를 들어, 서로 다른 9개의 자연수 3, 29, 38, 12, 57, 74, 40, 85, 61 이 주어지면, 이들 중 최댓값은 85이고, ..

알고리즘 연습 2019.12.28

[백준_BOJ] 10818. 최소, 최대 JAVA

문제 풀이 최소, 최대를 찾는 문제입니다. 사실 이 문제를 풀이할 때에 배열을 꼭 만들어주지 않아도 되지만 카테고리가 배열이기 때문에 배열을 만들어주어 배열에 값을 입력받았습니다. Integer.MIN_VALUE를 max 변수에 저장하고 Integer.MAX_VALUE를 min 변수에 저장한 뒤 입력되는 정수 가운데 가장 최솟값과 최댓값을 찾아 min과 max에 저장해준 뒤 모든 정수의 값을 확인하고 출력해주었습니다. 코드 출처 https://www.acmicpc.net/problem/10818 10818번: 최소, 최대 첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,..

알고리즘 연습 2019.12.18

[백준_BOJ] 1647. 도시 분할 계획 _ JAVA

문제 풀이 크루스칼 알고리즘을 이용해서 풀이한 문제입니다. 크루스칼 알고리즘을 이용하기 위해 3가지 메서드 union, find, isSame을 만들어주었습니다. 이전에 풀이했던 1922. 네트워크 연결 문제처럼 문제풀이를 했다가 메모리 초과가 발생했던 문제입니다. 사실 생각해보면 가장 짧은 비용의 연결선부터 연결하기 때문에 map 배열은 풀이에 필요하지 않습니다. N이 10만까지 가능하기 때문에 2차원 map 배열을 만들면 메모리 초과가 발생합니다. size 변수를 이용해서 N - 2개의 연결이 만들어질 때까지 가능한 간선들을 계속 연결해주었습니다. 입력이 크다는 점에 주의하면 크루스칼 알고리즘을 이용해 쉽게 풀이할 수 있는 문제입니다. 먼저, union 메서드에서는 시작점과 도착점 x, y를 매개변수..

알고리즘 연습 2019.12.13

[백준_BOJ] 1922. 네트워크 연결 _ JAVA

문제 풀이 크루스칼 알고리즘을 이용해서 풀이한 문제입니다. 크루스칼 알고리즘을 이용하기 위해 3가지 메서드 union, find, isSame을 만들어주었습니다. 추가적으로 비용이 적은 간선들부터 연결해주기 위해 Priority Queue를 사용했습니다. Comparable을 이용해 비용순으로 정렬해서 이용하였습니다. 먼저, union 메서드에서는 시작점과 도착점 x, y를 매개변수로 입력받아서 find(x) 와 find(x)가 같지 않다면, 서로 다른 그룹에 속해 있는 것이므로 두 그룹 중에서 작은 값으로 합쳐주었습니다. 크기를 비교하여 합쳐주지 않고 그냥 x나 y로 합쳐주어도 괜찮지만 작은 번호로 합쳐주면 검색 속도를 높여줄 수 있습니다. find 메서드는 자신이 그룹 번호와 같은 경우, 자기 자신을..

알고리즘 연습 2019.12.13

[백준_BOJ] 1110. 더하기 사이클 _ Java

문제 풀이 간단한 시뮬레이션 문제 정도로 생각하면 될 것 같습니다. 수의 변형 규칙이 주어질 때 시작할 때와 같은 값 즉, 원래의 숫자로 돌아가는 데까지 걸리는 사이클을 구하는 문제입니다. 저는 while 문을 사용하여 풀이하였습니다. 사이클이 성립될 때까지 주어진 규칙대로 계속 반복 수행하기 위해서 입니다. 먼저 while 문이 수행될 때마다 cnt를 1씩 증가시켜주었습니다. 그리고 나서 주어진 수의 1의 자리의 수를 second 변수에 저장해두었습니다. tmp에 원래 일의 자리의 수를 옮겨 담은 뒤 새로 만들어진 다음 수 " (first + second) % 10 " 의 일의 자리를 second에 저장해주었습니다. 그리고 나서 기존의 숫자를 저장해둔 N과 새로 만들어진 수가 같은지를 비교하여 같다면 ..

알고리즘 연습 2019.12.08

[백준_BOJ] 10951. A+B - 4 _ Java

문제 풀이 이번 문제는 입력이 종료되는 조건이 따로 주어지지 않습니다. 그래서 Scanner를 이용하여 while문의 조건으로 sc.hasNextInt() 가 거짓일 경우 -> 더 이상 입력이 없는 것으로 간주하여 종료해주었습니다. A와 B를 입력받은 이후에는 A+B를 출력해주면 되는 간단한 문제였습니다. 코드 출처 https://www.acmicpc.net/problem/10951 10951번: A+B - 4 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오. www.acmicpc.net

알고리즘 연습 2019.12.08

[백준_BOJ] 10952. A+B - 5 _ Java

문제 풀이 이 문제는 간단히 두 수를 입력받아 합을 출력해주면 되는 문제입니다. 입력이 많은 경우를 생각하여 Stringbuilder를 사용하였습니다. while문에서 A 와 B가 모두 0이 아니라면 A+B의 값을 Stringbuilder에 계속 담아주었습니다. while문이 종료되면 결과 값을 출력해주고 종료해주었습니다. 코드 출처 https://www.acmicpc.net/problem/10952 10952번: A+B - 5 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오. www.acmicpc.net

알고리즘 연습 2019.12.08
반응형