멀티캠퍼스 백엔드 과정52일차[8월 18일] - 자료구조, 알고리즘 문자열, 재귀

GoldenDusk·2023년 8월 20일
0
post-thumbnail

문자열

🍇 문자열의 기본

정의

  • 문자열이란 문자의 배열
  • 여러 개의 문자가 배열을 이룬 것
char character = 'H';
           String str = "Hello";

🍇 문자의 배열(배열을 이용해서 표현)

자바에서 문자열의 문자를 가져오는 방법 2가지

  1. 첫 번 째 방법
  • 문자를 하나 씩 쉽게 가져온다.
  • 특정 몇 개의 문자가 필요할 때 사용
  • 단점) 메소드 호출에 따른 오버헤드가 있다.
String.charAt(int index) :  char ch = String.charAt(0);
  1. 두 번째 방법
  • 모든 문자가 들어 있는 char[] 데이터를 반환
  • 모든 문자를 한 번에 가져온다.
  • 문자의 길이에 해당하는 메모리 사용한다.
  • 문자열의 모든 문자 정보가 필요할때 사용
String.toCharArray()

🍇 아스키 코드

String az = "";
abcdef.....z

정의

  • 문자를 내부적으로 정수로 취급하여 연산할 수 있다.
  • 문자를 정수로 , 정수를 문자로 바꾸어서 사용할 수 있다.
  • 128개의 문자를 가진 정수 코드
char digit = '9'; 
      int digitToInt = digit - '0' ;   57 - 48
      digitToInt 의 값은?  숫자 9

StringBuilder

  • 자바에서 문자열을 쉽고 효율적으로 구성하기 위한 클래스
String az = "";
abcdef.....z

🍇 관련 코테 문제

첫 번째 문제 : 자연수 뒤집기

  1. 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12932
  2. 코드
class Solution {
    public int[] solution(long n) {
        // 입력된 long 타입의 n을 문자열로 변환하여 저장
        String s = String.valueOf(n);
        
        // StringBuilder를 사용하여 문자열을 뒤집음
        StringBuilder sb = new StringBuilder(s);
        sb = sb.reverse();
        
        // 뒤집힌 문자열을 각 자릿수마다 나눠서 배열로 저장
        String[] ss = sb.toString().split("");
        
        // 정답을 저장할 int 배열 선언
        int[] answer = new int[ss.length];
        
        // 각 문자열을 정수로 변환하여 정답 배열에 저장
        for (int i = 0; i < ss.length; i++) {
            answer[i] = Integer.parseInt(ss[i]);
        }
        
        // 최종 결과인 정답 배열 반환
        return answer;
    }
}
import java.util.stream.IntStream;

class Solution {
    public int[] solution(long n) {
        return new StringBuilder().append(n).reverse().chars().map(Character::getNumericValue).toArray();
    }
}
  1. 문제 풀이 : 두 번째 풀이에 대한 해석

두 번째 문제 : 시저 암호

  1. 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12926

  2. 코드

  3. 문제 풀이

    1. 알파벳을 n만큼 밀어야 한다. ==> 아스키코드 값을 n만큼 증가
      (단, 'Z', 'z' 더 증가시키면 알파벳 범위를 벗어나므로 , 마지막에 도달하면 처음부터 시작하도록 설정)
    2. 입력 문자열의 모든 문자에 대해 반복하며 입력받은 문자열을 순회하면서 문자를 하나씩 이어 붙어야 한다. StringBuilder
    3. 문자 c를 n만큼 새로운 문자를 계산하기 위한 메서드 push(char c , int n)
    StringBuilder builder = new StringBuilder();
       for(char c : s.toCharArray()){
    
            //c를 n만큼 민 문자를 builder에 붙이기 
        }
    
        private char push(char c, int n){
                 //c를 n만큼 밀어 변환 
            }

    d. 알파벳이 아닌 경우 문자를 그대로 이어 붙이기

    private char push(char c, int n){
             if( !Character.isAlphabetic(c)) return c;
          //if(!(c >= 'A' && c<= 'Z')&& !(c>='a' && c<='z')) return c;
     
               //c를 n만큼 밀기 
    
              int offset = Character.isUpperCase(c) ? 'A' : 'a';
              int position = c - offset;
    
               position  = (position + n) % ('Z' - 'A' +1);
    
               return  (char) (offset + position)
    
       }

    e. 알파벳인 경우 n만큼 밀어 이어 붙이기

    a ==>0  ~z (25)     z+1 =26   ==> 0 되돌려야 한다., 공통적으로 적용 
       알파벳을 0~25 인 숫자로 변환  n만큼 미는 것은 같은 로직 적용 
    
       int offset = Character.isUpperCase(c) ? 'A' : 'a';
       int position = c - offset;
    
       position  = (position + n) % ('Z' - 'A' +1);
    
       return  (char) (offset + position)
    
      for(char c: s.toCharArray()){
    
         builder.append(push(c,n))
       }

세 번째 문제 : 이상한 문자 만들기

  1. 문제링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12930
  2. 내가 푼 코드 ⇒ 정확성에서 떨어
class Solution {
    public String solution(String s) {
        StringBuilder answer = new StringBuilder();
        // 문자를 공백으로 분리
        String[] words = s.split(" ");
        
        // 공백별로 짝/홀수를 구현하기 위해
        for(String word : words){
            for(int i=0; i<word.length(); i++){
                char c = word.charAt(i);
                if(i % 2 ==0){
                    // 짝수 번째
                    answer.append(Character.toUpperCase(c));
                    
                }
                else{
                    // 홀수번째
                    answer.append(Character.toLowerCase(c));
                }
            }
            // 출력 될 때는 공백이 필요하니 공백 추가
            answer.append(" ");
        }
        // 공백 제거 후 결과 반환
        return answer.toString().trim();
    }
}

재귀

🍇 재귀 개념

  • 메소드 호출 이용한 방법
  • 하나의 메소드내에서 자기 자신을 호출하도록 구현\

🍇 예제 1

  1. 문제 링크 : https://jungol.co.kr/problem/587?cursor=eyJwcm9ibGVtc2V0IjoiMiIsImZpZWxkIjoxMiwiaWR4IjoxfQ==
  2. 코드
import java.util.Scanner;
 
public class Main {
 
    

      public static void main(String[] args){

        int input= 0 ;
        Scanner sc = new Scanner(System.in);
        input  = sc.nextInt();
        recursive(input);

}

	   public static void recursive(int input)
	   {
		if(input == 0) { return;}
		else {
			System.out.println("recursive");
			recursive(input-1);
		}
		
	    }
}

🍇 예제 2

  1. 문제링크 : https://jungol.co.kr/problem/588?cursor=eyJwcm9ibGVtc2V0IjoyLCJmaWVsZCI6MTIsImlkeCI6M30=
  2. 코드
import java.util.Scanner;
 
public class Main {
 
    

      public static void main(String[] args){

        int input= 0 ;
        Scanner sc = new Scanner(System.in);
        input  = sc.nextInt();
        recursive(input);

}

	   public static void recursive(int input)
	   {
		if(input == 0) { return;}
		else {
			System.out.print(input + " ");
			recursive(input-1);
		}
		
	    }
}

🍇 예제 3

  1. 문제 링크 : https://jungol.co.kr/problem/589?cursor=eyJwcm9ibGVtc2V0IjoyLCJmaWVsZCI6MTIsImlkeCI6NX0=
  2. 코드 : 그냥 for문을 이용한 것
import java.util.Scanner;
 
public class Main {
 
    

      public static void main(String[] args){

        int input= 0 ;
        Scanner sc = new Scanner(System.in);
        input  = sc.nextInt();
        recursive(input);

}

	   public static void recursive(int input)
	   {
        int sum = 0;
		if(input == 0) { return;}
		else {
			for(int i = 1; i<=input; i++){
                sum += i;
            }
		}
		System.out.print(sum);
	    }
}
  1. 재귀함수 이용
  • 주의 : sum은 static로 빼줘야 함 안그러면 출력이 0이 되어버림
  • 올바르게 누적한 값을 유지하려면 sum 변수를 전역 변수로 선언하여 두 함수에서 공유해야 한다.
import java.util.Scanner;
 
public class Main {
    static int sum = 0;
    

      public static void main(String[] args){

        int input= 0 ;
        Scanner sc = new Scanner(System.in);
        input  = sc.nextInt();
        recursive(input);

}

	   public static void recursive(int input)
	   {
        
		if(input == 0) { 
            System.out.print(sum);
            return;}
		else {
			sum += input;
            recursive(input-1);
		}
		
	    }
}

회고

회고라기 보다는 나의 피곤도 상태..이번주 내내 집중 안되는데 집중력 잡고 있었다.. 월, 화를 제대로 못쉬었나... 주말 알바하고 있는 지금 이 순간도 너무 피곤하다... 체력이 중요한게 이건가 이번달안에 운동 끊어야지...

profile
내 지식을 기록하여, 다른 사람들과 공유하여 함께 발전하는 사람이 되고 싶다. gitbook에도 정리중 ~

0개의 댓글