Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

백정탈의 개발 블로그

문자열 문제 본문

코딩테스트

문자열 문제

백정탈 2023. 2. 23. 22:32

1. 특정 문자 찾기

입력된 문자열에서 특정 문자를 갯수는 for문을 사용하여 누적하면 된다.

	public int solution(String str, char t){
		int answer=0;
		str=str.toUpperCase();
		t=Character.toUpperCase(t);
		//System.out.println(str+" "+t);
		/*for(int i=0; i<str.length(); i++){
			if(str.charAt(i)==t) answer++;
		}*/
		for(char x : str.toCharArray()){
			if(x==t) answer++;
		}
		return answer;

2. 대소문자 변환

Character.isLowerCase(x)는 x문자가 소문자이면 true를 반환하고 대문자 일시 false를 반환하다 

Character.isUpperCase(x)는 x문자가 소문자이면 false를 반환하고 대문자 일시 true를 반환하다 

Character.toUpperCase(x)와 Character.toLowerCase(x);는 각각 소문자를 대문자, 대문자를 소문자로 바꿔주는 함수다.

for(char x : str.toCharArray()){
			if(Character.isLowerCase(x)) answer+=Character.toUpperCase(x);
			else answer+=Character.toLowerCase(x);
		}

3.문장속 단어

한 개의 문장이 주어지면 그 문장 속에서 가장 긴 단어를 출력하는 문제로 문장이 입력 되면 String[] s = str.split(" ");을 사용해 split(" ")문자를 기준으로 문자열을 나누어 S배열에 저장한다. 저장된 S배열을 for문을 사용해 서로 비교해서 가장 긴 단어를 찾는다. 

import java.util.*;
class Main {	
	public String solution(String str){
		String answer="";
		int m=Integer.MIN_VALUE;
		String[] s = str.split(" ");
		for(String x : s){
			int len=x.length();
			if(len>m){
				m=len;
				answer=x;
			}
		}
		return answer;
	}

	public static void main(String[] args){
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		String str=kb.nextLine();
		System.out.print(T.solution(str));
	}
}

이것도 다른 방법으로 indexOf()와 subString()을 사용해 가장 긴 단어를 찾는 방법이다. indexOf()  특정문자 문자열 앞에서 부터 처음 발견되는 인덱스하며 만약 찾지 못할 경우 -1를 반환 substring(0,pos)은 0번쨰 부터 pos-1번째 문자열까지를 말한다. substring(pos+1)은  pos+1배열부터 문자열을 시작한다.

import java.util.*;
class Main {	
	public String solution(String str){
		String answer="";
		int m=Integer.MIN_VALUE, pos;
		while((pos=str.indexOf(' '))!=-1){
			String tmp=str.substring(0, pos);
			int len=tmp.length();
			if(len>m){
				m=len;
				answer=tmp;
			}
			str=str.substring(pos+1);
		}
		if(str.length()>m) answer=str;
		return answer;
	}

	public static void main(String[] args){
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		String str=kb.nextLine();
		System.out.print(T.solution(str));
	}
}

indexOf()  특정 문자 문자열 앞에서부터 처음 발견되는 인덱스를 반환하며

만약 찾지 못했을 경우 "-1"을 반환


4.단어 뒤집기

new StringBuilder(x).reverse().toString();를 사용하면 문자를 뒤집어주는 함수이다. StringBuilder는 문자를 추가하거나 삭제가 가능한 문자열 클래이다.

import java.util.*;
class Main {	
	public ArrayList<String> solution(int n, String[] str){
		ArrayList<String> answer=new ArrayList<>(); 
		for(String x : str){
			String tmp=new StringBuilder(x).reverse().toString();
			answer.add(tmp);
		}
		return answer;
	}

	public static void main(String[] args){
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		int n=kb.nextInt();
		String[] str=new String[n];
		for(int i=0; i<n; i++){
			str[i]=kb.next();
		}
		for(String x : T.solution(n, str)){
			System.out.println(x);
		}
	}
}

 

lt는 str[0]을 가리키고, rt는 str[n-1]을 가리킨다. 반복문을 사용해 lt와 rt의 문자열을 서로 바꿔준 다음 lt++,rt-- 서로 반대편 문자열르 가르쳐준다.

import java.util.*;
class Main {	
	public ArrayList<String> solution(int n, String[] str){
		ArrayList<String> answer=new ArrayList<>(); 
		for(String x : str){
			char[] s=x.toCharArray();
			int lt=0, rt=x.length()-1;
			while(lt<rt){
				char tmp=s[lt];
				s[lt]=s[rt];
				s[rt]=tmp;
				lt++;
				rt--;
			}
			String tmp=String.valueOf(s);
			answer.add(tmp);
		}
		return answer;
	}

	public static void main(String[] args){
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		int n=kb.nextInt();
		String[] str=new String[n];
		for(int i=0; i<n; i++){
			str[i]=kb.next();
		}
		for(String x : T.solution(n, str)){
			System.out.println(x);
		}
	}
}

5.특정 문자 뒤집기

이문제는 반대편에 있는 문자가 알파벳이면 서로 뒤집는 문제이다.

 

Character.isAlphabetic(s[rt]) 메소드를 사용하면 해당 열에 있는 문자가 알파벳이면 true를 반환한다.

 

lt는 s[0]을 가리키는 변수이고  rt는 s[str.length()-1]을 가리키는 변수이다. for문이 한번 진행 될때마다 lt는 한칸씩 앞으로 가고 rt는 한칸씩 뒤로 가면서 서로 반대되는 문자를 가르치면서 문자가 알파벳이면 교환해준다.

public String solution(String str){
		String answer;
		char[] s=str.toCharArray();
		int lt=0, rt=str.length()-1;
		while(lt<rt){
			if(!Character.isAlphabetic(s[lt])) lt++;
			else if(!Character.isAlphabetic(s[rt])) rt--;
			else{
				char tmp=s[lt];
				s[lt]=s[rt];
				s[rt]=tmp;
				lt++;
				rt--;
			}
		}
		answer=String.valueOf(s);
		return answer;

6.중복문자제거

indexOf(str.charAt(i))는 문자가 서로 중복되어도 첫 문자를 위치를 가르킨다. str.indexOf(str.charAt(i))==i) true 일때만 answer에만 넣어주면 된다. 

public String solution(String str){
		String answer="";
		for(int i=0; i<str.length(); i++){
			//System.out.println(str.charAt(i)+" "+i+" "+str.indexOf(str.charAt(i)));
			if(str.indexOf(str.charAt(i))==i) answer+=str.charAt(i);
		}
		return answer;
	}

7.회문문자열

회문문자는 뒤집어도 같은 문자열을 말한다. 이문제에서는 대소문자 구분 하지 않는다. 했으므로 str.toUpperCase(); 사용해 str문자열을 대문자로 만든다. for문 반복횟수 또한 len/2로 줄여서 반대 문자열이 같은지 만 비교하면 된다. if(str.charAt(i)!=str.charAt(len-i-1)) 

import java.util.*;
class Main {	
	public String solution(String str){
		String answer="YES";
		str=str.toUpperCase();
		int len=str.length();
		for(int i=0; i<len/2; i++){
			if(str.charAt(i)!=str.charAt(len-i-1)) answer="NO";
		}
		return answer;
	}

	public static void main(String[] args){
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		String str=kb.next();
		System.out.print(T.solution(str));
	}
}

8.유효한 팰린드롬

앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 팰린드롬이라고 한다. 

문제의 조건은 "단 회문을 검사할 때 알파벳만 가지고 회문을 검사하며, 대소문자를 구분하지 않습니다." 예시로  found7, time: study; Yduts; emit, 7Dnuof을 서로비교하기 위해 알파벳만 있는 새로운 문자열을 만들어야 한다. s.toUpperCase().replaceAll("[^A-Z]", "");를 사용하면 알파벳만 남아있는 새로운 문자열이 생성된다.  new StringBuilder(s).reverse().toString();을 사용해 문자열을 뒤집고 서로 비교하면 확인이 가능하다.

import java.util.*;
class Main {	
	public String solution(String s){
		String answer="NO";
		s=s.toUpperCase().replaceAll("[^A-Z]", "");
		String tmp=new StringBuilder(s).reverse().toString();
		if(s.equals(tmp)) answer="YES";
		return answer;
	}

	public static void main(String[] args){
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		String str=kb.nextLine();
		System.out.print(T.solution(str));
	}
}

9.숫자만 추출

문자열에 숫자만 추출하면 되는것으로 Character.isDigit(x)함수를 사용해 숫자인지 true를 반환 받아 answer+=x 넣어준다.

return때 정수로 반환해야 하기 때문에 Interger.parseInt(answer)를 해준다.

import java.util.*;
class Main {	
	public int solution(String s){
		//int answer=0;
		String answer="";
		for(char x : s.toCharArray()){
			//if(x>=48 && x<=57) answer=answer*10+(x-48);
			/*if(Character.isDigit(x)){
				answer=answer*10+ Character.getNumericValue(x);
			}*/
			if(Character.isDigit(x)) answer+=x;
		}
		return Integer.parseInt(answer);
	}

	public static void main(String[] args){
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		String str=kb.next();
		System.out.print(T.solution(str));
	}
}

10. 가장 짧은 문자거리

한 개의 문자열 s와 문자 t가 주어지면 문자열 s의 각 문자가 문자 t와 떨어진 최소거리를 출 력하는 프로그램으로 예시가 문자열S가 teachermode이고 t변수가 문자e이면 int p=1000라는 변수를 사용해 거리를 측정한다. s.charAt(i)==t가 true이면 문자e의 거리가 0이므로 p=0으로 변경하고 answer[i]에 대입한다. false이면 한칸씩 멀어지는것으로 p++로 증가하고 answer[i] 대입한다. 그렇게 되면 

이렇게 되는 데 문자e와의 최소거리가 아니므로 for문을 for(int i=s.length()-1; i>=0; i--)해서 비교해 가장 작은수를 대입한다. 

import java.util.*;
class Main {	
	public int[] solution(String s, char t){
		int[] answer=new int[s.length()];
		int p=1000;
		for(int i=0; i<s.length(); i++){
			if(s.charAt(i)==t){
				p=0;
				answer[i]=p;
			}
			else{
				p++;
				answer[i]=p;
			}
		}
		p=1000;
		for(int i=s.length()-1; i>=0; i--){
			if(s.charAt(i)==t) p=0;
			else{
				p++;
				answer[i]=Math.min(answer[i], p);
			}
		}
		return answer;
	}

	public static void main(String[] args){
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		String str=kb.next();
		char c=kb.next().charAt(0);
		for(int x : T.solution(str, c)){
			System.out.print(x+" ");
		}
	}
}

11.문자열 압축

문자열을 입력받아 같은 문자가 연속으로 반복되는 경우 반복되는 문자 바로 오른쪽에 반복 횟수를 표기하는 방법 KKHSSSSSSSE를  K2HS7E로 바꿔주는 것이다. 문자열s에 빈칸을 추가하고 cnt변수는 if(s.charAt(i)==s.charAt(i+1)) 일경우 cnt++하여 s.charAt(i)==s.charAt(i+1) false일경우에 멈추어 반복된 문자의 갯수가 되고 cnt=1로 초기화 된다.

public String solution(String s){
		String answer="";
		s=s+" ";
		int cnt=1;
		for(int i=0; i<s.length()-1; i++){
			if(s.charAt(i)==s.charAt(i+1)) cnt++;
			else{
				answer+=s.charAt(i);
				if(cnt>1) answer+=String.valueOf(cnt);
				cnt=1;
			}
		}
		return answer;