[JAVA] 알고리즘 기초 자바 문법 - 문자열

Kiefer Sol·2024년 7월 4일

알고리즘

목록 보기
2/35

이번 포스트에서는 자바로 알고리즘 문제를 풀기위해서 필요한 자바 문법을 간단하게 정리한다.
[인프런] 자바 알고리즘 문제풀이 의 문제를 풀면서 내용을 참조했다.

1) 문자 찾기

  • 한 개의 문자열을 입력받고, 특정 문자를 입력받아 해당 특정문자가 입력받은 문자열에 몇 개 존재하는지 알아내는 프로그램을 작성하세요. 대소문자를 구분하지 않습니다.
    ex) Computercooler / c => 2

  • 소문자-> 대문자 변환
    문자열 : str.toUpperCase()
    문자: Character.toUpperCase(ch)
  • 대문자 -> 소문자 변환
    문자열 : str.toLowerCase()
    문자: Character.toLowerCase(ch)
  • 문자열 -> 문자 배열 : char[] chArray = str.toCharArray();
  • 문자 배열 -> 문자열 : String str = String.valueOf(chArray);

2) 대소문자 변환

  • 대문자와 소문자가 같이 존재하는 문자열을 입력받아 대문자는 소문자로 소문자는 대문자로 변환하여 출력하는 프로그램을 작성하세요.
    ex) StuDY => sTUdy

  • 대문자 구분
    가. 문자열 : str.isUpperCase()
    나. 문자: Character.isUpperCase(ch)(ch)
  • 소문자 구분
    가. 문자열 : str.isLowerCase()
    나. 문자: Character.isLowerCase(ch)

3) 문장 속 단어

  • 한 개의 문장이 주어지면 그 문장 속에서 가장 긴 단어를 출력하는 프로그램을 작성하세요.
    문장 속 단어는 공백으로 구분됩니다.
    ex) it is time to study => study

  • 특정문자열로 나누기 : String[] strArray = str.split("");
  • 문자열 길이: int len = str.length();

4) 단어 뒤집기

  • N개의 단어가 주어지면 각 단어를 뒤집어 출력하는 프로그램을 작성하세요.
    ex) 3 /good/Time/Big => doog/emiT/giB

  • 문자열 뒤집기
    String str_rev = new StringBuilder(str).reverse().toString();

5) 특정 문자 뒤집기

  • 영어 알파벳과 특수문자로 구성된 문자열이 주어지면 영어 알파벳만 뒤집고, 특수문자는 자기 자리에 그대로 있는 문자열을 만들어 출력하는 프로그램을 작성하세요
    ex) a#b!GET@S -> S#T!EGb@a

    풀이) 왼쪽 자리에 특수문자면 lt++, 오른쪽 자리에 특수 문자면 rt++, 왼쪽 오른쪽 문자이면 lt와 rt 모두++
  • 문자열 -> 문자 배열 : char[] chArray = str.toCharArray();
  • 문자 배열 -> 문자열 : String str = String.valueOf(chArray);
  • 알파벳인지 확인 : boolean isAlpha = Character.isAlphabetic(ch);

6) 중복 문자제거

  • 소문자로 된 한개의 문자열이 입력되면 중복된 문자를 제거하고 출력하는 프로그램을 작성하세요. 중복이 제거된 문자열의 각 문자는 원래 문자열의 순서를 유지합니다.
    ex) ksekkset -> kset

    풀이) 해당 문자의 인덱스 번호를 찾아서 현재 위치가 아니면 삭제한다. => if(str.indexOf(str.charAt(i)==i))
  • 앞에서부터 해당 문자의 인덱스 번호 찾기 int num = str.indexOf(ch)
  • 뒤에서부터 해당 문자의 인덱스 번호 찾기 int num = str.lastIndexOf(ch)

7) 회문 문자열

  • 앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 회문 문자열이라고 합니다. 문자열이 입력되면 해당 문자열이 회문 문자열이면 "YES", 회문 문자열이 아니면 “NO"를 출력하는 프로그램을 작성하세요.
    ex) gooG => YES

  • 문자열 뒤집기 String str_rev = new StringBuilder(str).reverse().toString();
  • 대소문자 무시하고 같은지 비교 boolean isTrue = str.equalsIgnoreCase(tmp)

8) 유효한 팰린드롬

  • 앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 팰린드롬이라고 합니다.문자열이 입력되면 해당 문자열이 팰린드롬이면 "YES", 아니면 “NO"를 출력하는 프로그램을 작성하세요. 단 회문을 검사할 때 알파벳만 가지고 회문을 검사하며, 대소문자를 구분하지 않습니다. 알파벳 이외의 문자들의 무시합니다.
    ex) found7, time: study; Yduts; emit, 7Dnuof => YES

  • 문자열 뒤집기, 대소문자 무시하고 같은지 비교 : 7번 참조
  • 알파벳이 아닌 문자 제거 => 알파벳이 아닌 것은 모두 빈칸으로 치환
    String str= str.replaceAll("[^A-Za-z]","")

9) 숫자만 추출

  • 문자와 숫자가 섞여있는 문자열이 주어지면 그 중 숫자만 추출하여 그 순서대로 자연수를 만
    듭니다
    ex) g0en2T0s8eSoft => 208

  • 8번 참조해서 알파벳 제거 : String str= str.replaceAll("[A-Za-z]","")
  • 문자 중 숫자 판단 : boolean a = Character.isDigit(ch)

10) 가장 짧은 문자거리

  • 한 개의 문자열 s와 문자 t가 주어지면 문자열 s의 각 문자가 문자 t와 떨어진 최소거리를 출
    력하는 프로그램을 작성하세요.
    ex) teachermode e => 1 0 1 2 1 0 1 2 2 1 0

    풀이)
    1. 초기 p를 큰 수로 지정
    2. 왼쪽부터 확인하면서 같으면 p=0로 초기화 다르면 p++ 해서 배열에 넣기
    3. 다시 p 큰 수로 초기화
    4. 오른쪽 확인하면서 왼쪽 방향 배열과 비교하면서 최솟값으로 지정
      같으면 p=0로 초기화 다르면 arr[i]=Math.min(arr[i],++p)
방향teachermode
왼쪽1000123012340
오른쪽1032104321100
최소값10121012210
public static int[] solution(String str, char ch) {
		int[] array = new int[str.length()];
		int p = 1000;
		for(int i=0; i<str.length(); i++) {
			if(str.charAt(i)==ch) {
				p=0;
				array[i]=p;
			}else {
				p++;
				array[i]=p;
			}
		}
		
		p = 1000;
		for(int i= str.length()-1; i>=0; i--) {
			if(str.charAt(i)==ch) {
				p=0;
				array[i]=p;
			}else {
				p++;
				array[i]=Math.min(array[i], p);
			}
		}
		return array;
	}

11) 문자열 압축

  • 알파벳 대문자로 이루어진 문자열을 입력받아 같은 문자가 연속으로 반복되는 경우 반복되는
    문자 바로 오른쪽에 반복 횟수를 표기하는 방법으로 문자열을 압축하는 프로그램을 작성하시
    오. 단 반복횟수가 1인 경우 생략합니다.
    ex) KKHSSSSSSSE => K2HS7E


    풀이)
    1. 초기문자 cnt=1
    2. 반복문 돌면서 현재 문자와 바로 뒷문자가 같으면 cnt++
    3. 뒷문자가 다르고 cnt가 1보다 크면 숫자 추가, 새로운 문자 추가, cnt=1로 초기화

12) 암호

  • 비밀편지는 알파벳 한 문자마다 # 또는 *이 일곱 개로 구성되어 있습니다.
  1. “#*#”를 일곱자리의 이진수로 바꿉니다. #은 이진수의 1로, *이진수의 0으로 변환합니다. 결과는 “1000001”로 변환됩니다.
  2. 바뀐 2진수를 10진수화 합니다. “1000001”을 10진수화 하면 65가 됩니다.
  3. 아스키 번호가 65문자로 변환합니다. 즉 아스크번호 65는 대문자 'A'입니다.
    ex) 4 / #**###############** => COOL


    풀이)
    1. 모든 문자의 #은 1로, *은 0으로 바꾼다.
    2. 문자열 0~6까지 자른다.
    3. 2진수-> 10진수 -> char 문자로 바꾸기
    4. 문자열에 0-6까지 삭제하고 7부터 다시 과정 시작
  • n부터 끝까지 문자열 자르기 String str1 = str.subString(n)
  • 인덱스 s부터 n-1까지 문자열 자르기 String str2 = str.subString(s,n)
  • 문자열을 특정 n진수로 숫자로 바꾸기 int num = Integer.parseInt(str,n)
public static String solution(int n, String str) {
		String answer="";
		str = str.replaceAll("\\#", "1").replaceAll("\\*", "0");
		
		for(int i=0; i<n; i++) {
			String temp = str.substring(0, 7);
			int num = Integer.parseInt(temp, 2);
			char ch = (char)num;
			answer+=ch;
			str = str.substring(7);
		}
		return answer;
	}
    
profile
여유를 가지고 Deep Dive

0개의 댓글