코딩테스트/프로그래머스

[프로그래머스 Lv.1] JAVA 문자열, 수 2

머밍 2024. 7. 2. 15:46

가운데 글자 가져오기

class Solution {
    public String solution(String s) {
        String answer = "";
        int len = s.length();
        int i = len/2;
        if(len % 2 ==1){
            answer = s.charAt(i)+"";
        }  else{
            answer = s.substring(i-1,i+1);
        }
        return answer;
    }
}
  • 다른 풀이 중 내 코드를 간단하게 구현했다.
    wow..수학을 잘해보자,..,
class StringExercise{
    String getMiddle(String word){
return word.substring((word.length()-1)/2, word.length()/2 + 1);
    }

수박수박수박수박수박수?

  • 처음엔 repeat함수를 쓰고싶었다.
class Solution {
    public String solution(int n) {
        String answer = "";
        String jjak = "수박";

        if(n%2==0){
            answer = jjak.repeat(n/2);
        } else{
            answer = jjak.repeat(n/2);
            answer += "수";
        }
        return answer;
    }
}

 

  • 위의 풀이과정에서 짝수 인덱스면 수, 홀수 인덱스면 박을 문자열에 추가하는게 나을 것 같아 구현했다.
class Solution {
    public String solution(int n) {
        String answer = "";
        for(int i=0;i<n;i++){
            answer += i%2==0 ? "수":"박";
        }
        return answer;
    }
}

 

내적

오랜만의 내적

class Solution {
    public int solution(int[] a, int[] b) {
        int answer = 0;
        for(int i=0; i<a.length; i++){
            answer += a[i]*b[i];
        }
        return answer;
    }
}

약수의 개수와 덧셈

약수의 개수가 홀수/짝수냐에 따라 덧셈,뺄셈이 정해짐

class Solution {
    public int solution(int left, int right) {
        int answer = 0;
        for(int i = left; i <= right; i++) {
            int sum = 0;
            for(int j = 1; j <= i; j++) {
                if(i % j == 0)  sum ++;

            }
            if(sum % 2== 0){
                answer += i;
            }else{
                answer -= i;
            }

        }
        return answer;
    }
}
  • 다른 사람 풀이
    제곱수인 경우 약수의 개수가 홀수임을 이용한 풀이다.
    진짜 몰랐다.
class Solution {
    public int solution(int left, int right) {
        int answer = 0;

        for (int i=left;i<=right;i++) {
            //제곱수인 경우 약수의 개수가 홀수
            if (i % Math.sqrt(i) == 0) {
                answer -= i;
            }
            //제곱수가 아닌 경우 약수의 개수가 짝수
            else {
                answer += i;
            }
        }

        return answer;
    }

문자열 내림차순으로 배치하기

  • 문제 풀이
  1. s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다
    -> char 배열을 만든 후, Arrays.sort로 먼저 정렬해준다.
  2. 이후 내림차순으로 즉, reverse해줘야한다. 이때 고민을 했는데, 문자열로 반환하니까 단순하게 StringBuilder를 사용했다. chars가 배열이기 때문에 String 객체로 만들었다.
import java.util.Arrays;

class Solution {
    public String solution(String s) {
        char[] chars = s.toCharArray();
        Arrays.sort(chars);

        StringBuilder sb = new StringBuilder(new String (chars));
        sb.reverse();
        return sb.toString();
    }
}

부족한 금액 계산하기

class Solution {
    public long solution(int price, int money, int count) {
        long answer = 0;
        long cur = 0;
        
        for(int i=1; i <= count; i++) {
            cur += price * i;
        }
        if(cur > money) {
            answer =  cur - money;
        }
        return answer;
    }
}

문자열 다루기 기본

Character.isDigit(char ch)
ch가 0부터 9까지의 숫자인지 여부를 판별

-> 다른 문제 풀때 알고 있던 함수라 쉽게 풀었다.

class Solution {
    public boolean solution(String s) {
        boolean answer = true;
        if(s.length()==4 || s.length()==6){
            for(int i=0;i<s.length();i++){
                if(!Character.isDigit(s.charAt(i))){
                    return false;
                }
            }
        } else {
            answer = false;
        }
        return answer;
    }
}

 

  • 정규 표현식 이용하기
s.split("[0-9]").length ==0
: 문자열 s에 숫자(0부터 9까지의 숫자)가 포함되어 있는지 여부를 판별

split("[0-9]"):문자열 s를 정규 표현식 [0-9]에 따라 분할. 숫자(0부터 9까지의 숫자)에 해당하는 모든 문자를 구분자로 삼아 문자열을 분리length ==0 : 즉 숫자로만 구성되어 있다면 배열의 길이는 0
class Solution {
    public boolean solution(String s) {
        boolean answer = true;
        
        if (s.length() == 4 || s.length() == 6) {
            if(s.split("[0-9]").length != 0){
                return false;
            }
        } else {
            // 길이가 4 또는 6이 아니면 false 반환
            return false;
        }
        return answer;
    }
}

직사각형 별찍기

import java.util.Scanner;

class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();

        for(int i = 0; i < b; i++) {
            String s = "*".repeat(a);
            System.out.println(s);
        }
    }
}

최대공약수와 최소공배수

최대공약수는 두 수 중 작은값부터 시작하여 검사.

  • n % i == 0 && m % i == 0 조건은 i가 n과 m의 공약수인지 확인
    -> 만족하면 i는 최대 공약수.
  • 두 수의 곱 / 최대 공약수 = 최소공배수
class Solution {
    public int[] solution(int n, int m) {
        int[] answer = new int[2];
        for(int i = Math.min(n,m); i > 0; i--) {
            if( n % i == 0 && m % i == 0) {
                answer[0] = i;
                answer[1] = (n*m)/i;    
                break;
            }
        }
        return answer;
    }
}

3진법 뒤집기

10진수 -> 3진수 -> 뒤집기한 3진수 -> 10진수의 문제다.
뒤집은 3진법을 어떻게 만들까 고민이었다.
3진법을 만드는 과정에서 n을 3으로 처음 나눈 나머지가 맨 앞으로 가면 이게 바로 뒤집은 3진법을 만드는 방법이라는 것을 알게되어 이를 통해 구현했다.
-> +=를 이용해 문자열로 뒤에 이어서 나머지를 넣어주면 된다.

Integer.parseInt(문자열, 진수); -> 문자열을 정해진 진수의 정수로 나타낸다.

class Solution {
    public int solution(int n) {
        String str ="";

        while(n!=0){
            str += n % 3;
            n /= 3;
        }
        return Integer.parseInt(str,3);
    }
}

크기가 작은 부분 문자열

첫번째 풀이

제한사항
1 ≤ p의 길이 ≤ 18

제한 사항을 안보고 풀어서 런타임에러났다.........
레벨1이라고 조건 대충 넘어가지 말자!!!!!!!!!!!!!!!!!!

class Solution {
    public int solution(String t, String p) {
        int answer = 0;
        int len = p.length();
        int np = Integer.parseInt(p);
        for(int i = 0; i < t.length()-len +1; i++) {
            int num = Integer.parseInt(t.substring(i,i+len));
            if(num <= np){
                answer++;
            }
        }
        return answer;
    }
}
  • 두번째 풀이
    long으로 바꾸어 풀었다. 정답~
class Solution {
    public int solution(String t, String p) {
        int answer = 0;
        int len = p.length();
        long lp = Long.parseLong(p);
        
        for(int i = 0; i < t.length()-len +1; i++) {
            Long num = Long.parseLong(t.substring(i, i+len));

            if(num <= lp){
                answer++;
            }
        }
        return answer;
    }
}

 

이상한 문자 만들기

class Solution {
    public String solution(String s) {
        String answer = "";
        String[] words = s.split("");
        int cur = 0;

        for(String str : words) {
            if(str.contains(" ")){
                cur = 0;
                answer += " ";
                continue;
            }
            cur++;
            answer += cur % 2 == 0? str.toLowerCase() : str.toUpperCase();
        }
        return answer;
    }
}

삼총사

삼중 for문으로 구현했고 배열의 첫번째부터 차례대로 하나씩 더한 값이 0인 개수를 찾는것이다.
따라서 이미 계산 된 경우는 세지 않는점을 이용했다.

number 예시: [-2, 3, 0, 2, -5]
i범위: -2~0 까지
j범위: 3~2까지
k범위: 0~-5까지

class Solution {
    public int solution(int[] number) {
        int answer = 0;
        int len = number.length;
        
        for (int i = 0; i < len -2; i++) {
            for (int j = i+1; j <len -1; j++) {
                for (int k = j+1; k < len; k++) {
                    int cur = number[i] + number[j] + number[k];
                    if(cur == 0){
                        answer++;
                    }
                }
            }
        }
        return answer;
    }
}

최소직사각형

  1. 일단 가로는 두 변중 가장 큰 값으로 고정한다.
  2. 가로로 설정된 명함 빼고 나머지 명함들 중에 가장 짧은 부분을 세로로 정한다.

-> 처음에 회전때문에 머리가 아팠는데 생각해보니 회전의 뜻은 가로나 세로를 구분하지 않고 구해라라는 것 같다.

class Solution {
    public int solution(int[][] sizes) {
        int max_w = 0;
        int max_h = 0;

        for(int i = 0; i < sizes.length; i++){
            int w = Math.max(sizes[i][0], sizes[i][1]);
            int h = Math.min(sizes[i][0], sizes[i][1]);
            
            //갱신
            max_w = Math.max(max_w, w);
            max_h = Math.max(max_h, h);
        }
        return max_w * max_h;
    }
}