java 205

가까운 수 (자바, Java)

처음에는 그냥 가볍게 풀다가, 가장 가까운 수가 더 작아 차이값이 음수가 나오는 경우도 고려해야 했다. 결국 set 자료형을 활용해서 풀었다. map자료형과 다르게, set 자료형은 백준에서 한 번 밖에 활용하지 않아, 아직은 활용이 낯설다. 하지만 코테에서는 꽤나 빈출하는 자료형이고, 중복체크에는 set이 괜찮아보여서 앞으로도 자주 활용할 예정. class Solution { public int solution(int[] array, int n) { int answer = 0; int l = array.length; int[] array2 = new int[l]; boolean sameDistance = false; // 같은거리여부 Set set = new HashSet(); for (int i=0; i

옹알이(1) (자바, Java)

레벨0에서 가장 정답률이 낮은 문제. 23%밖에 안되서 궁금하길래 풀어보았다. 자꾸 테스트케이스 7,8에서 에러가 나서, 정답을 찾아봤는데 효율을 포기하고 무식하게 구했던 케이스가 많았다. 그래서 조금 더 생각해보다가 반례를 생각해냈고, 해당 반례에 대한 문제점을 해결하기 위해 blank가 아닌 ?로 replace를 해주어 한번 필터하고, 두번째 replace에서 ?를 blank로 바꿔주었다. 안그러면 한번 필터를 통해 불완전한 단어가 합쳐지면서, 필터가 오동작하여 return값이 이상하게 반환되는 경우가 있었다. class Solution { public int solution(String[] babbling) { int answer = 0; String[] str = {"aya", "ye", "woo..

구슬을 나누는 경우의 수 (자바, Java)

조합, 이항계수 문제다. 3C2 = 3, 5C2 = 10같은 경우인데, 백준에서 풀때 느꼈지만, 팩토리얼은 조금만 숫자가 커져도 금방 자릿수가 기하급수적으로 증가한다. 따라서 double로도 커버가 안되고, BigInteger를 써주는 편이 좋다. 힌트에서 조합 공식을 소개했으나, 숫자가 빠르게 커지는 점이나, 연산량이 많아지는 점을 고려하여 나는 nPm/m! 으로 풀었다. import java.math.BigInteger; class Solution { public int solution(int balls, int share) { int answer = 0; BigInteger bi = permutation(balls, share).divide(permutation(share, share)); answ..

모스부호 (1) (자바, Java)

모스부호가 이미지로 현란하니까 겁줘서 그렇지...어려운 문제는 아니다 (애초에 레벨0에 정답률이 8할 이상..) 역시나 값에서 순서를 추출하는데엔 map자료형 활용함. import java.util.HashMap; import java.util.Map; class Solution { public String solution(String letter) { String answer = ""; StringBuilder sb = new StringBuilder(); String[] morse = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..

중복된 문자 제거 (자바, Java)

그냥 평범한 문자열 문제다. charAt, char와 int의 변환 등을 알면 쉽게 풀 수 있다. 문자열 제거는 StringBuilder를 이용했다. 문자열 변환이 빈번하게 일어난다면, 아무래도 String보단 StringBuilder가 좋기 때문. class Solution { public String solution(String my_string) { String answer = ""; StringBuffer sb = new StringBuffer(my_string); boolean[] count = new boolean [53]; // 0은 공백, 1~26은 소문자, 27~52는 대문자. 1회이상 등장시 true 반환. boolean[] check = new boolean[my_string.leng..

최댓값 만들기(2) (자바, Java)

음수가 있냐, 없냐에 따라 갈린다. 최댓값 만들기 (1) 에서는 양수만 있었기 때문에, 정렬 후 끝값 2개 (=가장 큰값 2개) 를 곱해주면 땡이지만, 음수가 있으면, 음수간 곱은 양수가 되고, 절댓값이 더 크다면 끝값보다 이쪽이 크기 때문. 하지만 음수*양수 로는 최댓값이 될 수 없기 때문에, 음수간 곱에서의 최대값 = 절대값이 가장 큰 두개의 값 = 정렬했을때 맨 앞의 두개의 값이다. 따라서, 정렬 후 맨 앞의 두 값의 곱과, 맨 뒤의 두 값의 곱을 구한 뒤, 양쪽을 비교해 큰값을 return하면 된다. import java.util.Arrays; class Solution { public int solution(int[] numbers) { int answer = 0; Arrays.sort(numb..

약수 구하기 (자바, Java)

귀찮아서 에라토스 테네스의 체를 쓰지 않았다. 이러면 연습이 안되는데, 반성해야한다. Queue를 이용해 풀었다. ArrayList로 풀수도 있지만, 가변적인 경우에 ArrayList로 이용하는걸 별로 안좋아해서. import java.util.LinkedList; import java.util.Queue; import java.util.Arrays; class Solution { public int[] solution(int n) { int[] answer = {}; Queue queue = new LinkedList(); for (int i=1; i