자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비(1)

최준영·2021년 9월 27일
6

알고리즘 풀이

목록 보기
13/14
post-custom-banner

1. 문자열

1) char형 변수 입력받기

  • Scanner를 이용하여 char형 변수를 직접 입력받을 수 없다.
  • char c = stdIn.next().charAt(0);
  • 문자열을 입력받은 후 0번 인덱스를 선택하는 방식으로 입력받을 수 있다.

2) 향상된 for문 & toCharArray

String str = "hello";
for (char c : str.toCharArray()) {
      if (c == t)
        answer++;
    }
  • str.toCharArray()를 쓴 이유는 해당 자리에 배열이나 리스트 등이 올 수 있으며, 문자열이 올 수 없기 때문이다.
  • 해당 코드를 사용하면 문자열을 char 배열에 복사한다.

2.1) String.valueOf

  • toCharArray로 변환된 문자를 String.valueOf(배열)에 넣으면 문자열로 변환된다.

3) 알파벳,숫자 아스키 코드

  • A ~ Z는 65 ~ 90, a ~ z는 97 ~ 122이다.
  • (char)(대문자 + 32)를 하면 소문자로 변환된다.
  • 0 ~ 9는 48 ~ 57이다.

4) split

public String split(String regex)
public String split(String regex, int limit)
  • regax가 문자열을 분리한 기준이 된다.
  • limit로 배열의 크기를 한정지을 수 있다.
String str = "it is time to study";
String[] strArr = str.split(" ");
System.out.println(strArr); // ["it", "is", "time", "to", "study"]

5) indexOf

indexOf(String str)
indexOf(int ch)
indexOf(int ch, int fromIndex)
indexOf(Stringstr, int fromIndex)
  • 특정 문자나 문자열의 앞에서부터 처음 발견되는 인덱스를 반환한다.
  • 찾지 못했을 경우 -1을 반환한다.

6) substring

String substring(int index)
// 해당 인덱스부터 이후의 문자열을 반환한다.
String substring(int beginIndex, int endIndex)
// begin 인덱스부터 end 인덱스 - 1까지의 문자열을 반환한다.

7) Array와 ArrayList

ArrayList<Integer> myArrayList = new ArrayList<>();

8) StringBuffer로 문자열 뒤집기

String str = "hello";
String reverse = new StringBuffer(str).reverse().toString();
// reverse = "olloeh"
  • String은 + 연산을 하면 객체가 새로 생성된다.
  • StringBuffer은 입력된 객체 하나로 변환 작업을 하는 것이다.
    • +연산과 같은 작업이 많을 경우 유리하다.
  • StringBuffer은 toSring으로 String형변환이 가능하다.

9) Character.isAlphabetic(), isLetter

Character.isAlphabetic('a'); // true
Character.isAlphabetic('A'); // true
Character.isAlphabetic('ㄱ'); // true
Character.isAlphabetic('가'); // true
Character.isAlphabetic('@'); // false
Character.isAlphabetic('1'); // false

Character.isLetter('a'); // true
Character.isLetter('A'); // true
Character.isLetter('ㄱ'); // true
Character.isLetter('가'); // true
Character.isLetter('@'); // false
Character.isLetter('1'); // false
  • 영문으로 한정하면 서로 같다.

9.2) Character.isDigit(c)

  • c가 숫자이면 true, 아니면 false를 리턴한다.

10) equalsIgnoreCase

  • a.equalsIgnoreCase(b) : 문자열 a와 b간에 대소문자를 무시하고 비교한다.

11) replaceAll(regex, replace)

String str =" a2v *;as";
System.out.println(str.replaceAll("[^A-Z]", ""));
// avas
  • regex는 정규 표현식이다. 해당 부분으로 원하는 문자를 특정지었다.
  • regex에 해당되는 문자를 replace로 교체한다.

12) 10진수 <-> 2진수, 8진수, 16진수

  • 10진수 -> 2진수, 8진수, 16진수
int num10 = 77;
String num2 = Integer.toBinaryString(num10); // 1001101
String num8 = Integer.toOctalString(num10); // 115
String num16 = Integer.toHexString(num10); // 4d
  • 2진수, 8진수, 16진수 -> 10진수
int num10_2 = Integer.parseInt(num2, 2); // 77
int num10_8 = Integer.parseInt(num8, 8); // 77
int num10_16 = Integer.parseInt(num16, 16); // 77

2. 배열


1) Math.max(a, b)

  • a와 b 중 큰 수를 반환한다.

2) 지도 상하좌우 관련

  • 상하좌우 좌표를 사용하는 경우는 int[] dx= {-1, 0, 1, 0}; int[] dy = {0, 1, 0, -1}; 고려해보기

3. Hashmap


1) 선언 방법

HashMap<K, V> map = new HashMap<>();

HashMap<String,String> map1 = new HashMap<String,String>();//HashMap생성
HashMap<String,String> map2 = new HashMap<>();//new에서 타입 파라미터 생략가능
HashMap<String,String> map3 = new HashMap<>(map1);//map1의 모든 값을 가진 HashMap생성
HashMap<String,String> map4 = new HashMap<>(10);//초기 용량(capacity)지정
HashMap<String,String> map5 = new HashMap<>(10, 0.7f);//초기 capacity,load factor지정
HashMap<String,String> map6 = new HashMap<String,String>(){{//초기값 지정
    put("a","b");
}};

2) 여러 메서드들

Map 안에 값 넣기

  • map.put(key, value);

Map에서 값 가져오기

  • map.get(key); : key에 해당하는 value 값 리턴
  • map.keySet() : 모든 key를 배열로 리턴

Map 크기 확인

  • map.size();

Map 안에 측정 key나 value가 있는지 확인

  • map.containsKey(key)
  • Map.containsValue(value);

Map 안의 내용 삭제

  • map.remove(key);

key가 있으면 value, 없으면 default 리턴

  • map.getOrDefault(key, default)

4. TreeSet


  • 참고자료 : https://coding-factory.tistory.com/555
  • 이진 탐색 트리로 이루어져 있다.
  • 추가와 삭제에 시간이 조금 더 걸리지만 정렬, 검색에 높은 성능을 보이는 자료구조이다.

1) 선언 방법

TreeSet<Integer> set1 = new TreeSet<Integer>();//TreeSet생성
TreeSet<Integer> set2 = new TreeSet<>();//new에서 타입 파라미터 생략가능, 오름차순
TreeSet<Integer> set3 = new TreeSet<Integer>(set1);//set1의 모든 값을 가진 TreeSet생성
TreeSet<Integer> set4 = new TreeSet<Integer>(Arrays.asList(1,2,3));//초기값 지정
TreeSet<Integer> set5 = new TreeSet<>(Collections.reverseOrder()); // 내림차순

2) 여러 메서드들

  • 추가하거나 삭제하면 자동정렬된다.

Tree에 값 추가

  • set.add(value) : 내부에 값이 존재하지 않는다면 추가한 뒤 true 반환, 내부에 값이 존재한다면 false 반환

Tree 값 삭제

  • set.remove(value) : 내부에 값이 존재한다면 삭제한 뒤 true 반환, 내부에 값이 없다면 false 반환
  • set.clear : 모든 값 제거

크기 구하기

  • set.size()

첫번째 값 구하기

  • set.first()

마지막 값 구하기

  • set.last()

입력값보다 큰 데이터중 최소값 출력 없으면 null

  • set.higher(value)

입력값보다 작은 데이터중 최대값 출력 없으면 null

  • set.lower(value)

5. stack, queue


1) stack

  • Last In First Out 구조

선언

Stack<Integer> stack = new stack<>();

값 추가

stack.push(1);

값 제거

stack.pop(); : 마지막에 들어간 값을 제거
stack.clear(); : 스택 초기화

마지막에 들어간 값 확인

stack.peek();

요소 개수 확인

stack.size();

해당 값이 있는지 확인

stack.contains(value);

비어있는지 확인

stack.isEmpty();

2) queue

  • First In First Out 구조

선언

Queue<Integer> que = new LinkedList<>();

값 추가

que.offer(1);

값 제거

que.poll(); : 마지막에 들어간 값을 제거
que.clear(); : 스택 초기화

첫번째에 들어간 값 확인

que.peek();

요소 개수 확인

que.size();

해당 값이 있는지 확인

que.contains(value);

비어있는지 확인

que.isEmpty();

6. 정렬과 검색

1) 선택정렬

  public int[] solution(int n, int[] arr) {
    for (int i = 0; i < n - 1; i++) {
      int idx = i;
      
      for (int j = i + 1; j < n; j++) {
        if (arr[idx] > arr[j]) {
          idx = j;
        }
      }

      int tmp = arr[i];
      arr[i] = arr[idx];
      arr[idx] = tmp;
    }
    return arr;
  }

2) 버블정렬

  public int[] solution(int n, int[] arr) {
    // 오름차순 방법 1
    for (int i = 0; i < n; i++) {
      for (int j = n -1; j > i; j--) {
        if (arr[j] < arr[j-1]) {
          int tmp = arr[j];
          arr[j] = arr[j-1];
          arr[j-1] = tmp;
        }
      }
    }
    
    // 오름차순 방법 2
    for (int i = 0; i < n - 1; i++) {
      for (int j = 0; j < n - 1 - i; j++) {
        if (arr[j] > arr[j + 1]) {
          int tmp = arr[j];
          arr[j] = arr[j + 1];
          arr[j + 1] = tmp;
        }
      }
    }
    return arr;
  }

3) 삽입정렬

  public int[] solution(int n, int[] arr) {
    for (int i = 1; i < n; i++) {
      int tmp = arr[i], j;
      for (j = i - 1; j >= 0; j--) {
        if (tmp < arr[j]) {
          arr[j + 1] = arr[j];
        } else {
          break;
        }
      }
      arr[j + 1] = tmp;
    }
    return arr;
  }

4) Comparable

class Point implements Comparable<Point> {
  public int x, y;
  Point(int x, int y) {
    this.x = x;
    this.y = y;
  }
  @Override
  public int compareTo(Point o) {
    if (this.x == o.x) return this.y - o.y; // 오름차순
    else return this.x - o.x;
  }
  // o.y - this.y는 내림차순
}

public class Main {
  public static void main(String[] args) {
    Scanner stdIn = new Scanner(System.in);
    int n = stdIn.nextInt();
    ArrayList<Point> arr = new ArrayList<>();
    for (int i = 0; i < n; i++) {
      int x = stdIn.nextInt();
      int y = stdIn.nextInt();
      arr.add(new Point(x, y));
    }
    Collections.sort(arr);
    for (Point o : arr) {
      System.out.println(o.x + " " + o.y);
    }
  }
}
  • 좌표를 오름차순으로 정렬하는 문제이다.
  • compareTo에서 양수를 반환하면 값을 바꾸고, 음수를 반환하면 값을 바꾸지 않는다. 따라서 오름차순으로 정렬하려고 할 때 현재 값에서 다음값을 뺀 것을 반환하면 된다.

5) stream

Arrays.stream(arr).max().getAsInt(); // arr 배열의 최댓값을 int형으로 반환
Array.stream(arr).sum(); // arr 배열의 합을 반환
profile
do for me
post-custom-banner

0개의 댓글