대소문자 변환

package inflearn21y12;

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

public class Main {
	public String solution(String str) {
		String answer = "";
		
		for(char x : str.toCharArray()) {
			if(Character.isLowerCase(x)) {
				answer += Character.toUpperCase(x);
			}else {
				answer += Character.toLowerCase(x);
			}
		}
		
		return answer;
	}

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

}

확장된 for문을 이용해서 str을 Character형으로 받아서 isLowerCase를 이용하면 소문자 인지 확인하는 

toLowerCase , toUpperCase를 이용해서 소문자 -> 대문자 , 대문자 -> 소문자로 바꿔주었다.

 

대문자 : 65 ~ 90

소문자 : 97 ~ 122

 

대문자 하고 소문자 차이 32난다 이걸 이용해서 풀 수 도 있음.

	public String solution(String str) {
		String answer = "";
		
		for(char x : str.toCharArray()) {
			if(x >= 65 && x <= 90) { 
				answer += (char)(x+32);
			}else {
				answer += (char)(x-32);
			}
		}
		
		return answer;
	}

가장 긴 단어 출력

it is time to study 하면 study가 제일 기므로 study 출력

	public String solution(String str) {
		String answer = "";
		
		int m = Integer.MIN_VALUE; // 가장 작은 값으로 초기화 됨 0이 제일 작은줄 알았는데
		String[] s = str.split(" ");
		
		for(String x : s) {
			int len = x.length();
			if(len>m) {
				m = len;
				answer = x;
			}
		}
		
		return answer;
	}

Integer.MIN_VALUE 를 이용하면 0보다 작은 int형의 제일 작은 값을 얻을 수 있다.

split배열로 넣어줬따.

	public String solution(String str) {
		String answer = "";
		
		int m = Integer.MIN_VALUE, pos; // 변수 두개 선언 하는 방법 뒤에도 가능하다..
		while((pos=str.indexOf(' ')) != -1){
			String tmp = str.substring(0, pos); // 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;
	}

항상 int m = 0 으로 했었는데

Integer.MIN_VALUE; 를 이용해서 더 작은 값을 초기화 하는 방법을 알았고,

indexOf로 다음값에 (" ") 이 없으면 -1을 반환하기 때문에 while문을 != -1로 해주고,

len을 이용해서 단어의 길이 즉 tmp의 길이를 len에 넣어준다.

 

그리고 if문으로 길이가 긴 단어가 여러개이면 가장 앞쪽에 위치한 단어를 답으로 한다.


단어 뒤집기

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

public 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) throws IOException{
		Main T = new Main();
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		String[] str = new String[n];
		for(int i=0; i<n; i++) {
			str[i] = br.readLine();
		}
		
		for(String x : T.solution(n, str)) {
			System.out.println(x);
		}
	}

}

StringBuilder를 이용해서 reverse로 문자를 뒤집었다.

 

근데 빌더를 이용하지 않고, 구현해본다.

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

public 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) throws IOException{
		Main T = new Main();
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		String[] str = new String[n];
		for(int i=0; i<n; i++) {
			str[i] = br.readLine();
		}
		
		for(String x : T.solution(n, str)) {
			System.out.println(x);
		}
	}

}

toCharArray로 String 값을 받는다.

그리고 맨 왼쪽 값 0으로 하고, 맨 오른쪽 값 rt를 length()로 받아준 후 -1을 해줘야한다.

 

while문의 조건을 어떻게 줄 것인가?

lt<rt 일떄 돌아가야 한다. 오른쪽 값이 클 경우

만약 good 을 입력하면 일단 0 , 3 교체 그리고 1 , 2 교체 그러면 lt 값이 커져서 그만두고 교환이 잘 됐다.

그럼 이제 홀 수 일땐? 0, 2 교체 그리고 1 , 1이 돼서 rt 가 클때만 돌아가야 하는데 크지 않기 때문에 돌아가지 않는다.

 

String tmp는 왜 해준 것이냐 하면 s값은 지금 char[] 형태로 되어 있어서 String형으로 변환해야 하기 떄문!


특정 문자 뒤집기

영어 알파벳이 나오면 뒤 집고 , 특수 문자가 나오면 자기 자리 그대로 있는 문자열을 만드는 문제

예를 들면 a^d 이면 d^a 이런식으로..

 

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

public class Main {
	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가 알파벳이 아닐때 확인 
				rt--;
			}else {
				char tmp = s[lt];
				s[lt] = s[rt];
				s[rt] = tmp;
				lt++; rt--;
			}
		}
		answer = String.valueOf(s);
		
		return answer;
	}

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

}

맨 왼쪽, 맨 오른쪽 값을 정의 하는 부분이 중요하다.

그리고 교환 법칙 그리고 toCharArray()로 String 문자열을 뽑아내는것도 중요

Character.isAlphabetic이라는 메소드를 이용해서 알파벳을 판별할 수 있다.

'Algorithm' 카테고리의 다른 글

[프로그래머스] 약수의 합  (0) 2022.02.04
[인프런] 알고리즘 Array , Two pointers  (0) 2021.12.27
[구름] 소인수 분해  (0) 2021.12.26
[구름] 구구단+  (0) 2021.12.26
[구름] 홀수의 합  (0) 2021.12.26

+ Recent posts