no image
[인프런 알고리즘] Chpater 1, 12번 문제(암호)
이 알고리즘 문제는 인프런의 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 (김태원)의 문제입니다.문제 설명 코드import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Main { public static String solution(int n, String message) { StringBuilder sb = new StringBuilder(); String binary; // 변환된 전체 이진수 문자열을 저장할 변수 String[] binaryCharArr = new String[n]; // 7비트 단위의 이진수 문자열을..
2024.07.11
no image
[인프런 알고리즘] Chapter 1, 11번 문제(문자열 압축)
이 알고리즘 문제는 인프런의 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 (김태원)의 문제입니다.문제 설명 코드import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Main { public static String solution(String str) { StringBuilder result = new StringBuilder(); int count = 1; for (int i = 1; i 1) result.append(count); count = 1; } } ..
2024.07.10
no image
[인프런 알고리즘] Chapter 1, 10번 문제(가장 짧은 문자거리)
이 알고리즘 문제는 인프런의 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 (김태원)의 문제입니다.문제 설명 코드import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.StringTokenizer;public class sec01_10 { public static int[] solution(String s, char t) { int[] numArr = new int[s.length()]; int ptr = 1000; for(int i = 0; i = 0; --i){ if(s.charAt(i) == ..
2024.07.09
no image
[인프런 알고리즘] Chapter 1, 9번 문제(숫자만 추출)
이 알고리즘 문제는 인프런의 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 (김태원)의 문제입니다.문제 설명 코드import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Main { public static String solution(String str) { String result = ""; for (char c : str.toCharArray()) { if(Character.isDigit(c)) { if(!(c == '0') || !(result.lengt..
2024.07.08
no image
[인프런 알고리즘] Chapter 1, 8번 문제(유효한 팰린드롬)
이 알고리즘 문제는 인프런의 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 (김태원)의 문제입니다.문제 설명 코드import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class sec01_08 { public static String solution(String str) { int lp = 0; int rp = str.length() - 1; String lower = str.toLowerCase(); while (lp  설명코드 주석 참고
2024.07.07
no image
[인프런 알고리즘] Chapter 1, 7번 문제(회문 문자열)
이 알고리즘 문제는 인프런의 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 (김태원)의 문제입니다.문제 설명 코드import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class sec01_07 { public static String solution(String str) { int lp = 0; int rp = str.length() -1; String lower = str.toLowerCase(); char[] temp = lower.toCharArray(); while (lp  설명solution 메서드는 문자열 st..
2024.07.07
no image
[인프런 알고리즘] Chapter 1, 6번 문제(중복 문자 제거)
이 알고리즘 문제는 인프런의 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 (김태원)의 문제입니다.문제 설명 코드import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class sec01_06 { public static String solution(String str){ String result = ""; for (int i = 0; i 또는import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.HashMap;..
2024.07.07
no image
[인프런 알고리즘] Chpater 1, 5번 문제(특정 문자 뒤집기)
이 알고리즘 문제는 인프런의 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비(https://cote.inflearn.com/contest/10/problems) (김태원)의 문제입니다.문제 설명 코드import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class sec01_05 { public static String solution(String str) { char[] temp = str.toCharArray(); int lp = 0; int rp = str.length() - 1; while (lp  설명초기 설정char[] tem..
2024.07.06

이 알고리즘 문제는 인프런의 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 (김태원)의 문제입니다.


문제 설명

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static String solution(int n, String message) {
        StringBuilder sb = new StringBuilder();
        String binary; // 변환된 전체 이진수 문자열을 저장할 변수
        String[] binaryCharArr = new String[n]; // 7비트 단위의 이진수 문자열을 저장할 배열
        int idx = 0; // 배열의 인덱스를 관리할 변수
        
        // 메시지에서 양 끝 공백을 제거한 후, #을 1로, *을 0으로 변환하여 sb에 추가
        sb.append(message.trim().replace('#', '1').replace('*', '0'));
        
        // 변환된 이진수 문자열을 binary 변수에 저장
        binary = sb.toString();
        sb = new StringBuilder(); // sb 초기화하여 이후 변환된 문자를 저장하는 데 사용
        
        // 이진수 문자열을 7비트 단위로 나누어 문자로 변환
        for(int i = 0; i < binary.length(); i += 7){
            // 7비트 단위로 잘라서 배열에 저장
            binaryCharArr[idx++] = binary.substring(i, i + 7);
            // 2진수 문자열을 정수로 변환하고 다시 문자로 변환하여 sb에 추가
            sb.append((char) Integer.parseInt(binaryCharArr[idx - 1], 2));
        }
        return sb.toString();
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        String message = br.readLine();
        System.out.println(solution(N, message));
    }
}

 

설명

  • 코드 주석 참고

이 알고리즘 문제는 인프런의 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 (김태원)의 문제입니다.


문제 설명

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static String solution(String str) {
        StringBuilder result = new StringBuilder();
        int count = 1;

        for (int i = 1; i < str.length(); ++i) {
            if(str.charAt(i) == str.charAt(i - 1)) ++count;
            else
            {
                result.append(str.charAt(i - 1));
                if(count > 1) result.append(count);
                count = 1;
            }
        }
        result.append(str.charAt(str.length() - 1)); //마지막 문자 처리
        if(count > 1) result.append(count);
        return result.toString();
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println(solution(br.readLine()));
    }
}

 

설명

  • StringBuilder result = new StringBuilder();
    결과 문자열을 효율적으로 만들기 위해 StringBuilder 객체를 생성한다. StringBuilder는 문자열을 추가할 때 성능이 뛰어나다.
  • int count = 1;
    현재 연속된 문자의 개수를 저장하는 변수 count를 초기화한다. 최초에는 1로 시작한다.
  • for (int i = 1; i < str.length(); ++i)
    문자열의 두 번째 문자부터 마지막 문자까지 순회한다. 첫 번째 문자와 비교하기 위해 인덱스 i를 1부터 시작한다.
  • if (str.charAt(i) == str.charAt(i - 1))
    - 현재 문자(str.charAt(i))가 이전 문자(str.charAt(i - 1))와 같은지 비교한다.
    - 같으면 count를 1 증가시킨다. 즉, 연속된 문자의 개수를 증가시킨다.
  • else 블록 -> 현재 문자가 이전 문자와 다르면
    - result.append(str.charAt(i - 1)) : 이전 문자를 결과 문자열에 추가한다.
    - if (count > 1) result.append(count); : count가 1보다 크면, 연속된 문자의 개수를 결과 문자열에 추가한다.
    - count = 1 : count를 다시 1로 초기화한다.
  • 마지막 문자 처리 -> 반복문이 종료된 후, 마지막 문자를 처리하기 위해
    - result.append(str.charAt(str.length() - 1)) : 마지막 문자를 결과 문자열에 추가한다.
    - if (count > 1) result.append(count); : 마지막 문자가 여러 번 연속된 경우, 그 개수를 결과 문자열에 추가한다.

이 알고리즘 문제는 인프런의 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 (김태원)의 문제입니다.


문제 설명

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class sec01_10 {
    public static int[] solution(String s, char t) {
        int[] numArr = new int[s.length()];
        int ptr = 1000;
        for(int i = 0; i < s.length(); ++i){
            if(s.charAt(i) == t)
            {
                ptr = 0;
                numArr[i] = ptr;
            }
            else numArr[i] = ++ptr;
        }

        for(int i = s.length() - 1; i >= 0; --i){
            if(s.charAt(i) == t) ptr = 0;
            else
            {
                ++ptr;
                numArr[i] = (numArr[i] < ptr) ? numArr[i] : ptr; //Math.min(numArr[i], ptr)
            }
        }
        return numArr;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        String s = st.nextToken();
        Character t = st.nextToken().charAt(0);
        for (int i : solution(s, t))
        {
            System.out.print(i + " ");
        }
    }
}

 

설명

  • 입력: 문자열 s와 문자 t
  • 출력: 각 문자에 대해 가장 가까운 t 문자와의 거리를 나타내는 배열
  • 로직
    -numArr 배열을 초기화하여 각 문자의 거리를 저장한다.
    -ptr 변수를 1000으로 초기화하여 충분히 큰 값으로 설정한다.
    -첫 번째 루프: 왼쪽에서 오른쪽으로 이동하면서 t 문자가 발견되면 ptr을 0으로 설정하고, 그렇지 않으면 ptr을 증가시켜 numArr에 저장한다.
    -두 번째 루프: 오른쪽에서 왼쪽으로 이동하면서 t 문자가 발견되면 ptr을 0으로 설정하고, 그렇지 않으면 ptr을 증가시켜 기존 값과 비교하여 더 작은 값을 numArr에 저장한다.

 

이 알고리즘 문제는 인프런의 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 (김태원)의 문제입니다.


문제 설명

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static String solution(String str) {
        String result = "";
        for (char c : str.toCharArray())
        {
            if(Character.isDigit(c))
            {
                if(!(c == '0') || !(result.length() == 0)) result += c;
            }
        }
        return result;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println(solution(br.readLine()));
    }
}

 

설명

  • 입력: String str - 사용자로부터 입력받은 문자열.
  • 출력: 숫자로만 구성된 문자열을 반환.
  • 빈 문자열 result를 초기화한다.
  • 입력받은 문자열 str을 문자 배열로 변환하고, 각 문자를 순회한다.
    Character.isDigit(c) 메서드를 사용하여 문자가 숫자인지 확인한다.
    문자가 숫자라면 다음 조건을 확인 -> 문자가 '0'이 아니거나, result가 빈 문자열이 아닌 경우 result에 문자를 추가
  • 결과 문자열 result를 반환한다.

이 알고리즘 문제는 인프런의 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 (김태원)의 문제입니다.


문제 설명

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class sec01_08 {
    public static String solution(String str) {
        int lp = 0; int rp = str.length() - 1;
        String lower = str.toLowerCase();
        while (lp < rp) {
            // 왼쪽 포인터가 가리키는 문자가 알파벳이나 숫자가 아닐 때 포인터 이동
            while (lp < rp && !Character.isLetterOrDigit(lower.charAt(lp))) lp++;
            // 오른쪽 포인터가 가리키는 문자가 알파벳이나 숫자가 아닐 때 포인터 이동
            while (lp < rp && !Character.isLetterOrDigit(lower.charAt(rp))) rp--;

            // 양 끝 문자가 다르면 회문이 아님
            if (lower.charAt(lp) != lower.charAt(rp)) return "NO";

            // 양 끝 문자가 같으면 포인터 이동
            lp++;
            rp--;
        }
        return "YES";

    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println(solution(br.readLine()));
    }
}

 

설명

  • 코드 주석 참고

이 알고리즘 문제는 인프런의 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 (김태원)의 문제입니다.


문제 설명

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class sec01_07 {
    public static String solution(String str) {
        int lp = 0; int rp = str.length() -1;
        String lower = str.toLowerCase();
        char[] temp = lower.toCharArray();
        while (lp < rp){
            if(temp[lp] != temp[rp]){
                return "NO";
            }
            ++lp; --rp;
        }
        return "YES";
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println(solution(br.readLine()));
    }
}

 

설명

  • solution 메서드는 문자열 str을 입력받아 회문인지 여부를 판단하여 "YES" 또는 "NO"를 반환한다.
  • int lp = 0; int rp = str.length() - 1;: lp는 왼쪽 포인터, rp는 오른쪽 포인터를 의미한다. lp는 문자열의 시작에서, rp는 문자열의 끝에서 시작한다.
  • String lower = str.toLowerCase();: 대소문자를 구분하지 않기 위해 문자열을 모두 소문자로 변환한다.
  • char[] temp = lower.toCharArray();: 소문자로 변환된 문자열을 문자 배열로 변환한다.
    while (lp < rp): 왼쪽 포인터가 오른쪽 포인터보다 작을 동안 반복한다.
    if (temp[lp] != temp[rp]): 양 끝의 문자가 다르면 회문이 아니므로 "NO"를 반환한다.
    ++lp; --rp;: 왼쪽 포인터는 오른쪽으로, 오른쪽 포인터는 왼쪽으로 이동한다.
  • 모든 문자가 일치하면 "YES"를 반환한다.

이 알고리즘 문제는 인프런의 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 (김태원)의 문제입니다.


문제 설명

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class sec01_06 {

    public static String solution(String str){
        String result = "";
        for (int i = 0; i < str.length(); ++i) {
            if(str.indexOf(str.charAt(i)) == i) result += str.charAt(i);
        }
        return result;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println(solution(br.readLine()));
    }
}

또는

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;

public class sec01_06 {
    public static String solution(String str) {
        StringBuilder sb = new StringBuilder();
        HashMap<Character, Boolean> map = new HashMap<>();
        for (char c : str.toCharArray()) {
            if (!map.containsKey(c)) {
                map.put(c, true);
                sb.append(c);
            }
        }
        return sb.toString();
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println(solution(br.readLine()));
    }
}

 

설명

첫 번째 코드 설명

  • indexOf() 메서드는 파라미터로 들어온 문자의 최초 등장 인덱스를 리턴함
  • charAt() 메서드는 파라미터로 들어온 정수에 해당하는 문자열의 인덱스값(문자)을 리턴
  • str.indexOf(str.charAt(i)) == i 조건문은 현재 문자가 문자열에서 처음 등장한 위치인지를 확인한다.
  • str.indexOf(str.charAt(i))는 현재 문자가 처음으로 등장하는 인덱스를 반환한다.
    이 인덱스가 현재 루프의 인덱스 i와 같으면, 해당 문자는 처음 등장한 것이므로 result에 추가한다.

 

두 번째 코드 설명

  • solution 메서드는 문자열 str을 입력받아 중복 문자가 제거된 문자열을 반환한다.
  • StringBuilder sb는 결과 문자열을 효율적으로 만들기 위해 사용된다.
  • HashMap<Character, Boolean> map은 각 문자가 이미 처리되었는지 여부를 추적하기 위해 사용된다.
  • for (char c : str.toCharArray()): 입력 문자열을 문자 배열로 변환하고, 각 문자를 순회한다.
  • if (!map.containsKey(c)): 현재 문자가 HashMap에 없는 경우, 즉 처음 등장하는 경우에만 HashMap에 추가하고 StringBuilder에 문자를 추가한다.
  • 최종적으로 StringBuilder에 누적된 문자열을 반환한다.

이 알고리즘 문제는 인프런의 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비(https://cote.inflearn.com/contest/10/problems) (김태원)의 문제입니다.


문제 설명

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class sec01_05 {
    public static String solution(String str) {
        char[] temp = str.toCharArray();
        int lp = 0; int rp = str.length() - 1;
        while (lp < rp){
            if(!Character.isAlphabetic(temp[lp])) ++lp;
            else if(!Character.isAlphabetic(temp[rp])) --rp;
            else {
                char tmp = temp[lp];
                temp[lp] = temp[rp];
                temp[rp] = tmp;
                ++lp; --rp;
            }
        }
        return String.valueOf(temp);
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println(solution(br.readLine()));
    }
}

 

설명

초기 설정

  • char[] temp = str.toCharArray();: 입력 문자열을 문자 배열로 변환한다. 문자열은 불변 객체이므로, 배열로 변환하여 개별 문자에 접근하고 수정하기 위함이다.
  • int lp = 0; int rp = str.length() - 1;: 두 개의 포인터 lp와 rp를 설정한다. lp는 배열의 시작을, rp는 배열의 끝을 가리킨다.

 

반복문

  • while (lp < rp): 두 포인터가 교차할 때까지 반복한다.
  • if (!Character.isAlphabetic(temp[lp])) ++lp;: lp가 가리키는 문자가 알파벳이 아니면 lp를 오른쪽으로 이동한다.
  • else if (!Character.isAlphabetic(temp[rp])) --rp;: rp가 가리키는 문자가 알파벳이 아니면 rp를 왼쪽으로 이동한다.
  • else: 두 포인터가 가리키는 문자가 모두 알파벳이면 두 문자를 교환하고, lp와 rp를 각각 오른쪽과 왼쪽으로 이동한다.

 

문자열 변환

  • return String.valueOf(temp);: 변환된 문자 배열을 문자열로 다시 변환하여 반환한다.

 

char[]의 toString() 메서드

char[] 배열에 대해 toString() 메서드를 호출하면, 배열의 요소를 문자열로 변환하는 것이 아니라, 배열 객체의 메모리 주소를 나타내는 해시코드를 포함한 문자열을 반환하게 된다.
이는 Object 클래스의 toString() 메서드가 호출되기 때문이다.
char[] 배열은 Object 클래스를 상속받기 때문에, 특별히 오버라이드된 toString() 메서드가 없다면 기본적으로 Object의 toString() 메서드가 사용된다.