알고리즘 문제 풀기 3일차
0. 오늘 푼 문제 정리
번호 | 문제명 | 프로그래머스난이도 |
1 | 예산 | 1 |
2 | 최대공약수와 최소 공배수 | 1 |
3 | K번째 수 | 1 |
4 | 나머지가 1이 되는 수 | 1 |
5 | 소수 찾기 | 1 |
6 | 실패율 | 1 |
7 | 체육복 | 1 |
8 | 폰켓몬 | 1 |
9 | [1차] 비밀지도 | 1 |
10 | 키패드 누르기 | 1 |
11 | [1차] 다트 게임 | 1 |
12 | 최댓값과 최솟값 | 1 |
13 | 숫자의 표현 | 1 |
14 | 크레인 인형뽑기 게임 | 1 |
1. 오늘 찾아보고 사용한 기능
1) 재귀 함수를 이요한 최대공약수 구하는 방법
public static int gcd(int p, int q)
{
if (q == 0) return p;
return gcd(q, p%q);
}
2) 배열에 해당 값이 몇개인지 파악하는 방법
int cnt = Collections.frequency(Arrays.asList(arr, n);
3)배열의 원소값들을 정렬하고 바뀐 인덱스 값으로 리턴하는 메서드
ex) {3,4,1,2} > {2,3,0,1}
public int[] sortbyvalue_returnindex(double[] d){
int temp_index = -1;
int[] res = new int[d.length];
for (int i = 0; i < d.length; i++) {
res[i] = i+1;
}
double temp;
for (int i = 0; i < d.length; i++) {
for (int j = i; j < d.length; j++) {
if(d[i]<d[j]){
temp_index = res[i];
temp = d[i];
res[i] = res[j];
res[j] = temp_index;
d[i] = d[j];
d[j] = temp;
} else if (d[i]==d[j] && res[i]>res[j]) {
temp_index = res[i];
res[i] = res[j];
res[j] = temp_index;
}
}
}
return res;
}
4) Switch 문에 case를 연달아 사용 가능하다.
switch(numbers[i]) {
case 1: case 4: case 7:
answer += "L";
tempL = numbers[i];
break;
case 3: case 6: case 9:
answer += "R";
tempR = numbers[i];
break;
default:
String tempHand = checkHand(numbers[i]);
if(tempHand.equals("R"))
tempR = numbers[i] + ((numbers[i] == 0)? 11:0);
else tempL = numbers[i] + ((numbers[i] == 0)? 11:0);
answer += tempHand;
break;
}
2) to.CharArray()를 쓰면 문자열 전체를 char 로 관리가능
import java.util.Arrays;
public class ReverseStr {
public String reverseStr(String str){
char[] ch = str.toCharArray();
Arrays.sort(ch);
StringBuffer st = new StringBuffer(String.valueOf(ch));
st.reverse();
return st.toString();
}
}
3) 배열에서 원하는 값에 대한 익덱스 값 찾기, 2가지 방법
import java.util.Arrays;
public class main {
public static void main(String[] args) {
String [] arr = {"a", "b", "c", "d","f"};
int index = Arrays.binarySearch(arr, "d");
System.out.println(index + " 에 해당하는 값 -> " + arr[index]);
}
}
import java.util.Arrays;
public class IndexOfTest {
public static void main(String[] args) {
String[] arr = {"a","b","c"};
System.out.println(Arrays.asList(arr).indexOf("b")); //1이 출력된다.
}
4) 배열 리스트로 변환 후 원하는 값 있는지 true/false로 리턴하기
public static void main(String args[]) {
String[] strArray = {"AB", "BC", "BCD", "CD", "CDEF"};
List<String> strList = new ArrayList<>(Arrays.asList(strArray));
if(strList.contains("BCD")) {
System.out.println("BCD는 strArray에 존재합니다.");
}
}
5) StringBuilder를 이용한 전체 바꾸기
import java.util.*;
class Solution {
public int solution(String s) {
int answer = 0;
StringBuilder sb = new StringBuilder("");
int len = s.length();
String[] digits = {"0","1","2","3","4","5","6","7","8","9"};
String[] alphabets = {"zero","one","two","three","four","five","six","seven","eight","nine"};
for(int i=0; i<10; i++){
s = s.replaceAll(alphabets[i],digits[i]);
}
return Integer.parseInt(s);
}
}
6) 정규 표현식을 통해 replaceall 함수를 보다 깔끔하고 빠르게 적용시킬 수 있다.
temp = temp.replaceAll("[^-_.a-z0-9]",""); // ^를 []안에 사용하여 예외를 넣고, -를 사용해 구간을 정해준다.
temp = temp.replaceAll("[.]{2,}","."); // { } 를 이용해 연속된 경우를 정해준다.
temp = temp.replaceAll("^[.]|[.]$",""); ^ 와 &을 이용해 구간시작과 끝에 대해 지정해준다
7) Math 를 이용해 최대 값 최소값을 비교할 수 있다.
int iMax = 0;
int iMin = 9999999;
int[] asScores= { 50, 55, 34, 65, 78, 93, 23};
//최대값 구하기
for(int i : asScores ) iMax = Math.max( i, iMax );
//최소값 구하기
for(int i : asScores ) iMin = Math.min( i, iMin );
8)startsWith, endsWith
String example = "Java programmers";
System.out.println(example.startsWith("J"));
System.out.println(example.startsWith("Jav"));
System.out.println(example.startsWith("Java p"));
System.out.println(example.startsWith("ava")) //false
System.out.println(example.endsWith("s"));
System.out.println(example.endsWith("rs"));
System.out.println(example.endsWith("programmers"));
System.out.println(example.endsWith("Java")); //false