Algorithms/프로그래머스

[프로그래머스] Lv2. 최댓값과 최솟값, JadenCase 문자열 만들기 Java

devran 2023. 7. 30. 18:14
반응형

프로그래머스로 코테연습을 안해서 레벨 2 정답률 순으로 풀어보려함.

문제는 알고리즘이 아니라 매개변수로 받아오는 것을 변환하는 방법을 숙지해야할듯!

자바는 너무어려워!!

조금씩 백준과 병행하려한다. 근데 난 백준이 더 좋다.. 이유는 모르겠지만

최댓값과 최솟값

https://school.programmers.co.kr/learn/courses/30/lessons/12939

문제

문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 최소값과 최대값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요.

예를들어 s가 "1 2 3 4"라면 "1 4"를 리턴하고, "-1 -2 -3 -4"라면 "-4 -1"을 리턴하면 됩니다.

제한 조건

  • s에는 둘 이상의 정수가 공백으로 구분되어 있습니다.

풀이

풀이에는 두가지 방법이 있다.

  1. Collections 이용
  2. 직접 최 최소를 구하는 법

Collections 이용

주어지는 매개변수는 String s → “숫자들 띄어스기로 구분된“ 형태로 주어지고,

Collections 를 활용하려면 ArrayList에 이를 담아야 한다.

String을 split하여 배열에 담고

포문을 이용해서 이를 ArrayList에 담아서 최댓값과 최솟값을 구해보자

참고로 반환도 스트링으로!

import java.util.*;

class Solution {
    public String solution(String s) {
        String answer = "";
        
        ArrayList<Integer> arr = new ArrayList<Integer>();
        
        String str[] = s.split(" ");
        
        for(int i = 0; i < str.length; i++){
            arr.add(Integer.parseInt(str[i]));
        }
        
        int max = Collections.max(arr);
        int min = Collections.min(arr);
        
        answer =  "" + min + " " +max;
        
        return answer;
    }
}

직접 구하는 법

임의로 최솟값과 최댓값을 지정하고

for문을 돌면서 최솟값보다 크면 갱신, 최댓값보다 작으면 갱신 이과정을 밟으며 최솟값과 최댓값을 구한다

class Solution{
		public String solution(String str){
			String[] tmp = str.split(" ");
			int min, max, n;
			min, max = Integer.parseInt(tmp[0]);

			for(int i = 1; i < tmp.length; i++){
				n = Integer.parseInt(tmp[i]);
			if(min>n) 
				min = n;

			if(max<n)
				max = n;
			}
	return min+""+max;
}

JadenCase 문자열 만들기

https://school.programmers.co.kr/learn/courses/30/lessons/12951

문제

JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)

문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.

제한 조건

  • s는 길이 1 이상 200 이하인 문자열입니다.
  • s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있습니다.
    • 숫자는 단어의 첫 문자로만 나옵니다.
    • 숫자로만 이루어진 단어는 없습니다.
    • 공백문자가 연속해서 나올 수 있습니다.

풀이

말그대로 첫 문자는 대문자, 그 외는 소문자로 처리해주면 된다

문자열이 주어지면 공백을 기준으로 ArrayList에 담고,

각각의 앞 문자가 숫자면 넘어가고, 글자인데 소문자면 대문자로 바꾸어주고

다시 출력하는 과정을 밟아보자

아무리해도 안돼서 찾아보니 이게 문제가 굉장히 까다롭다는 것을 알게됨

// 공백문자가 여러개 오면 split 오류 나옴 -> StringToknizer사용할 것 
// StringTokenizer(String str, String delim, boolean flag) : flag는 구분자 자체도 토큰으로 인식하게 할지 여부를 정한다. 
import java.util.*;

class Solution {
    public String solution(String s) {
        s = s.toLowerCase();
        
        // s를 공백기준으로, 공백포함하여 파싱하기 
        StringTokenizer st = new StringTokenizer(s, " ", true);
				StringBuilder sb = new StringBuilder();
       
        while(st.hasMoreTokens()) {
            String word = st.nextToken();
            if(word.equals(" "))
                sb.append(word); // 공백이면 그냥 넣기 
            else // 공백이 아니라면 substring을 이용하여 맨 첫번재는 대문자로, 나머지는 소문자를 유지
                sb.append(word.substring(0,1).toUpperCase() + word.substring(1));
        }
        
        return sb.toString(); // StringBuilder로 만든 객체는 toString을 통해 String타입으로 리턴
    }
}

서치한 것 중 가장 완벽한 코드.. 대단한 듯.. 어케 이런 생각을 할까?

class Solution {
  public String solution(String s) {
        String answer = "";
        String[] sp = s.toLowerCase().split("");
        boolean flag = true;

        for(String ss : sp) {
            answer += flag ? ss.toUpperCase() : ss;
            flag = ss.equals(" ") ? true : false;
        }

        return answer;
  }
}

StringTokenizer - java.util.StringTokenizer

💡 StringTokenizer 알고가자!!

StringTokenizer(String str); → 매개변수 str을 공백 기준으로 분리

StringTokenizer(String str, String delim); → 특정 delim으로 문자열 분리

StringTokenizer(String str, String delim, boolean returnDelims) → 특정 delim으로 문자열을 분리하되, 그 delim까지 token으로 포함할지 결정 !! 예를 들어 delim을 “ “ 이렇게 공백으로 두었을때, 이를 token으로 칠지 안칠지!! true 포함, false 비포함을 뜻함

subString() - java.lang.String 클래스의 substring()

substring() 메소드는 다음과 같이 2가지 형태로 사용할 수 있음

  • public String substring(int startIndex) // 시작 인덱스 부터 끝까지 리턴!
  • public String substring(int startIndex, int endIndex) // 시작인덱스 부터 끝-1 까지 리턴

 

반응형