프로그래머스

최현주·2024년 1월 11일
1
문자열 겹쳐쓰기

https://tiny-stone.com/87

class Solution {
    public String solution(String my_string, String overwrite_string, int s) {
        String answer = my_string.substring(0,s) + overwrite_string;
        
        if(my_string.length()>answer.length()){
            answer += my_string.substring(answer.length());
        }
        
       
        return answer;
    }
}

substring()메서드를 사용해 my_string 문자열의 인덱스 0부터 s직전까지의 문자열과 overwrite()를 합쳤고, 그 값을 변수 answer에 저장했다.
my_string의 길이가 answer의 길이보다 길다면 my_string문자열에서 answer 문자열의 길이(9)만큼을 뺀 나머지 문자열을 answer문자열에 더하는 if문을 추가했다.
그래서 my_string 문자열의 길이가 변수 answer문자열의 길이보다 길다면 my_string문자열에서 answer문자열의 길이(9)를 뺀만큼 나머지 문자열을 answer문자열에 더하는 if문을 추가했다.

문자열 섞어쓰기

charAt를 이용한코드

class Solution {
    public String solution(String str1, String str2) {
        String answer = "";
        for(int i=0;i<str1.length();i++){
            answer = answer+str1.charAt(i)+str2.charAt(i);
        }
        return answer;
    }
}

charAt는 문자열에서 특정 인덱스에 해당하는 문자를 반환하는 메서드이다. 인덱스는 문자열의 각 문자가 위치하는 순서를 나타내며, 대부분의 프로그래밍언어에서는 0부터 시작한다.
다음은 charAt의 예제이다.

public class CharAtExample {
    public static void main(String[] args) {
        String myString = "Hello, World!";
        
        // 7번째 인덱스의 문자 가져오기
        char characterAtIndex = myString.charAt(7);
        
        System.out.println("문자열: " + myString);
        System.out.println("7번째 인덱스의 문자: " + characterAtIndex);
    }
}

charAt(7)를 통해 7번째 인덱스에 해당하는 문자를 가져와 출력한다는것을 알 수 있다.

substring을 이용한 코드

class Solution {
    public String solution(String str1, String str2) {
        String answer = "";
        
        for(int i = 0; i < str1.length(); i++) {
            answer += str1.substring(i, i+1);
            answer += str2.substring(i, i+1);
        }
        return answer;
    }
}

str1 반복문에 substring()메서드를 이용하여 str1 한번, str2 한번 한글자씩 번갈아가면서 answer에 이어붙이도록했다
substring이란?
java에서 부분 문자열을 추출하는데 사용되는 메서드이다.
이 메서드는 문자열에서 시작 인덱스부터 끝 인덱스 직전까지의 부분 문자열을 반환한다.

public class SubstringExample {
    public static void main(String[] args) {
        String originalString = "Hello, World!";
        
        // 부분 문자열 추출 (인덱스 7부터 끝까지)
        String substring1 = originalString.substring(7);
        System.out.println("Substring 1: " + substring1);
        
        // 부분 문자열 추출 (인덱스 0부터 5 직전까지)
        String substring2 = originalString.substring(0, 5);
        System.out.println("Substring 2: " + substring2);
    }
}
	

이 예제는 Hello, World!라는 문자열을 사용하고 있으며, 'substring(7)'은 7번째 인덱스부터 끝까지 추출하고 substring(0,5)는 첫번째 인덱스부터 5번째 인덱스 직전까지 추출한다
출력결과는 다음과 같다

Substring 1: World!
Substring 2: Hello
문자 리스트를 문자열로 변환하기

참고 사이트 :https://organize1202.tistory.com/24

class Solution {
    public String solution(String[] arr) {
        String answer = "";
        for (int i=0; i<arr.length; i++){
            answer = answer + arr[i];
        }
        return answer;
    }
}

java의 string[] length 함수를 쓰는 문제이다.
string[] 배열

String[] name = new String[5]; //5개의 문자열을 담을 수 있는 배열이 생성된다.

길이찾는 함수 length, length(), string의 차이
1. length
-array(int[], double[], string[])
-length는 배열의 길이를 알고싶을 때 사용한다.

String[] array = {"Hello","World","OpenAI"}
int length = array.length;
  1. length()
    String related Object(String, String builder etc)
    -length()는 문자열의 길이를 알고싶을 때 사용한다.

  2. size()
    -Collection Object(Array List, Set etc)
    -size()는 컬렉션프레임워크 타입의 길이를 알고싶을 때 사용한다.

더 크게 합치기

참고사이트 : https://velog.io/@hyewon4052/JAVA-%EB%8D%94-%ED%81%AC%EA%B2%8C-%ED%95%A9%EC%B9%98%EA%B8%B0

두 수의 연산값 비교하기

참고사이트 :
1.
https://ssdragon.tistory.com/22
2.
https://velog.io/@friend463/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.0-Java-%EB%91%90-%EC%88%98%EC%9D%98-%EC%97%B0%EC%82%B0%EA%B0%92-%EB%B9%84%EA%B5%90%ED%95%98%EA%B8%B0
3.
https://velog.io/@jayking_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%91%90-%EC%88%98%EC%9D%98-%EC%97%B0%EC%82%B0%EA%B0%92-%EB%B9%84%EA%B5%90%ED%95%98%EA%B8%B0

n의 배수

정수 num과 n이 매개 변수로 주어질 때, num이 n의 배수이면 1을 return n의 배수가 아니라면 0을 return하도록 solution 함수를 완성해주세요.

class Solution {
    public int solution(int num, int n) {
        int answer = 0;
        if(num%n==0){
            return 1;
        }else{
            return 0;
        }
    }
}
    
공배수

정수 number와 n, m이 주어집니다. number가 n의 배수이면서 m의 배수이면 1을 아니라면 0을 return하도록 solution 함수를 완성해주세요.

class Solution {
    public int solution(int number, int n, int m) {
        int answer = 0;
        if(number%n==0&&number%m==0){
            return 1;
        }else{
            return 0;
        }
    }
}
홀짝에 따라 다른 값 반환하기

양의 정수 n이 매개변수로 주어질 때, n이 홀수라면 n 이하의 홀수인 모든 양의 정수의 합을 return 하고 n이 짝수라면 n 이하의 짝수인 모든 양의 정수의 제곱의 합을 return 하는 solution 함수를 작성해 주세요

class Solution {
    public int solution(int n) {
        int answer = 0;
        if(n%2==1){
            for(int i=1;i<=n;i+=2){
                answer += i;
            }
        }else{
            for(int i=2;i<=n;i+=2){
                answer+=i*i;
            }
        }
        return answer;
    }
}
조건문자열

참고사이트 : https://velog.io/@peace_e/Java-%EC%A1%B0%EA%B1%B4-%EB%AC%B8%EC%9E%90%EC%97%B4

문제풀이
  • 4가지 조건에 따라 값을 달리 출력하는 코드를 만든다.
  • ineq가 "<"와 ">"중 어떤 값인지 eq가 "="와 "!"중 어떤 값인지 알아내야한다.
    (값이 같은지를 비교한다)
동등 비교 연산자 vs .equals()


출처 : 생활코딩 JAVA 제어문 -5
자바에서는 데이터타입을 primitive data type(원시 데이터 타입)과 non primitive data type(비원시 데이터 타입)으로 나눌 수 있다.
원시 데이터타입에는 booean int, double, short, long, float, char이 있다
비 원시데이터타입에는 String, Array, Data, type등등이 있다.
두 타입간에는 메모리를 저장하고 처리하는 방식에 차이가 있다.

int같은 원시데이터타입은 p1과 p2변수가 같은 객체 1을 가리키고 있어서 두 변수가 가리키는 객체가 동일하다. 이때 ==로 비교하면 true를 반환한다.

그러나 비 원시데이터타입은 객체의 주소 값이 다르면 같은 객체의 내용이어도 동일하다고 여기지않기때문에 ==로 비교하면 false를 반환한다. 비 원시데이터타입은 equals()라는 메소드를 가지고 equlas()로 비교할 경우에는 가리키는 값을 기준으로 판단한다.

비원시 데이터 중에서 String은 좀 특이하다. new키워드를 통해 다른 String 객체를 메모리에 할당할 경우에는 o1과 o2가 가리키는 객체의 주소 값은 다르므로 동일하지 않으나, new키워드 없이 리터럴 방식으로 같은 String인 o3과 o4를 생성하게되면 새로 메모리 공간을 할당하지 않고 원시 데이터타입처럼 기존 객체의 주소값을 그대로 가져온다. 그래서 ==로도 비교가능하다

class Solution {
        public int solution(String ineq, String eq, int n, int m) {
                if (ineq.equals(">")) {
                        if (eq.equals("=")) {
                                return n >= m ? 1 : 0;
                        } else if (eq.equals("!")) {
                                return n > m ? 1 : 0;
                        }
                } else if (ineq.equals("<")) {
                        if (eq.equals("=")) {
                                return n <= m ? 1 : 0;
                        } else if (eq.equals("!")) {
                                return n < m ? 1 : 0;
                        }
                }

                return 0; // 기본적으로 0을 반환 (조건에 맞지 않는 경우)
        }
}

이 코드는 네 개의 입력 매개변수를 받아 비교를 수행하는 solution 메서드를 정의합니다. 매개변수로는 두 개의 문자열(ineqeq)과 두 개의 정수(nm)가 있으며, 이 메서드는 정수를 반환합니다.

  1. public int solution(String ineq, String eq, int n, int m) {: 이 줄은 solution이라는 메서드를 선언하며, 두 개의 문자열 (ineqeq) 및 두 개의 정수 (nm)를 매개변수로 받습니다. 이 메서드는 정수를 반환합니다.

  2. if (ineq.equals(">")) {: ineq 문자열이 ">"(크다) 기호와 같은지 확인합니다.

  3. 첫 번째 if 블록 내부:

    • if (eq.equals("=")) {: eq 문자열이 "="(같다) 기호와 같은지 확인합니다.

      • return n >= m ? 1 : 0;: 만약 nm보다 크거나 같으면 1을 반환하고, 그렇지 않으면 0을 반환합니다.
    • else if (eq.equals("!")) {: eq 문자열이 "!"(같지 않다) 기호와 같은지 확인합니다.

      • return n > m ? 1 : 0;: 만약 n이 엄격하게 m보다 크면 1을 반환하고, 그렇지 않으면 0을 반환합니다.
  4. } else if (ineq.equals("<")) {: ineq가 ">"(크다)가 아니라면, 이번에는 "<"(작다)인지 확인합니다.

  5. 두 번째 if 블록 내부:

    • if (eq.equals("=")) {: eq 문자열이 "="(같다) 기호와 같은지 확인합니다.

      • return n <= m ? 1 : 0;: 만약 nm보다 작거나 같으면 1을 반환하고, 그렇지 않으면 0을 반환합니다.
    • else if (eq.equals("!")) {: eq 문자열이 "!"(같지 않다) 기호와 같은지 확인합니다.

      • return n < m ? 1 : 0;: 만약 n이 엄격하게 m보다 작으면 1을 반환하고, 그렇지 않으면 0을 반환합니다.
  6. return 0;: 위의 모든 조건이 만족되지 않으면 기본 반환 값으로 0을 반환합니다.

즉, 이 코드는 두 정수(nm)를 주어진 부등호(ineq) 및 등호(eq) 조건에 따라 비교하고, 조건을 만족하면 1을 반환하고, 그렇지 않으면 0을 반환하는 메서드입니다.

flag에 따라 다른 값 반환하기
class Solution {
    public int solution(int a, int b, boolean flag) {
        int answer = 0;
        if(flag==true){
            answer=a+b;
        }else{
            answer=a-b;
        }
        return answer;
    }
}

if조건문을 사용하여 flag타입이 true인지 확인해주면 된다.

주사위 게임

참고사이트 : https://sigfriede.tistory.com/182

class Solution {
    public int solution(int a, int b, int c) {
        int answer = 0;
        if(a != b && a != c && b != c){
            answer = a+b+c;
        }else if(a == b && a == c) {
            answer = (a+b+c)*(a*a+b*b+c*c)*(a*a*a+b*b*b+c*c*c);
        }else{
            answer = (a+b+c)*(a*a+b*b+c*c);
        }
        return answer;
    }
}

조건에서 제시한대로 풀어쓴 것입니다. 만약 a와 b가 같지 않고 동시에 a와 c가 같지 않고 동시에 b와 c가 같지 않다면 answer에 a + b + c를 할당합니다.

만약 a와 b가 같고 동시에 a와 c가 같다면 answer에 (a + b + c) (a제곱 + b제곱 + c제곱) (a세제곱 + b세제곱 + c세제곱)을 할당합니다.

만약 앞선 두 조건을 충족하지 않는다면 answer에 (a + b + c) * (a제곱 + b제곱 + c제곱)을 할당합니다. 거듭제곱은 Math 클래스의 pow 함수를 이용할 수 있습니다. 다만 이렇게 연속적으로 제곱수가 등장해야할 경우에는 오히려 가독성이 떨어질 듯해서 이용하지 않았습니다.

원소들의 곱과 합

참고사이트 : https://yongku.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%9B%90%EC%86%8C%EB%93%A4%EC%9D%98-%EA%B3%B1%EA%B3%BC-%ED%95%A9-%EC%9E%90%EB%B0%94JAVA

class Solution {
  public int solution(int[] num_list) {
      int answer = 0;
      int sum = 0;
      int mul = 1;
      for(int i=0;i<num_list.length;i++){
          sum+=num_list[i];
          mul*=num_list[i];
      }
      if(sum*sum>mul){
          answer = 1;
      }
      return answer;
  }
}

단순히 배열에 들어있는 값을 더한 값에 제곱을 구하고, 각 원소들의 곱한값을 구한다.

if문을 사용하여 단순비교를 한다

하지만, 이 문제는 제곱값과 곱한값이 같은 경우는 고려하지않은 문제이다.

모음사전

참고사이트 : https://velog.io/@pass0210/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%AA%A8%EC%9D%8C%EC%82%AC%EC%A0%84

class Solution {
    String word;
    int answer;
    int count = 0;
    String[] dict = new String[] {"A", "E", "I", "O", "U"} ;
    public int solution(String word){
        this.answer = 0;
        this.word = word;
        String initString = "";
        dfs(initString);
        return answer;
    }
    public void dfs(String initString){
        if(initString.equals(word)){
            answer = count;
        }
        if(initString.equals(word)){
            answer = count;
        }
        if(initString.length()==5){
            return;
        }
        for (int i=0;i<dict.length;i++){
            count++;
            dfs(initString + dict[1]);

    }
    }
}

코드를 정답이 나오면 멈춰야 하는데 모든 경우에 수를 다 돌고 정답을 저장한 뒤 코드가 끝나는 것을 볼 수 있다. 이 부분은 다음에 수정해서 올리겠다.
다음 코드를 살펴보면 일단 word와 answer 그리고 값을 증가시키기 위한 count, 단어들을 추가하기 위한 모음들의 배열 dict를 만들어주고 solution함수 내부에서 전역변수에 값을 할당해주고 dfs를 초기 문자열을 넣어줌과 동시에 실행시킨다.

dfs 함수를 살펴보면 문자열을 받아서 모음 배열의 길이만큼 반복문을 돌리며 count를 하나씩 증가시키고 다음 현재 문자열에 모음을 한개 추가해서 다음 dfs 함수로 이동한다.

위 함수가 반복하다가 word와 같아지면 answer에 count값을 넣고 문자열의 길이가 5와 같아지면 return을 하게된다.이렇게 되면 문자열이 5글자가 되면 4번째 위치로 돌아가게 되고 거기에 다음 모음을 더해서 다시 dfs를 돌게된다.

이렇게 모든 경우의 수를 다 돌고 나면 answer에는 word의 사전 위치가 저장되고 answer를 리턴하면 정답이 나오게 된다.

콜라문제

참고사이트 : https://yongku.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%BD%9C%EB%9D%BC-%EB%AC%B8%EC%A0%9C-%EC%9E%90%EB%B0%94JAVA

class Solution {
    public int solution(int a, int b, int n) {
        // 보유중인 빈병이 a개 미만이면, 추가적으로 빈 병을 받을 순 없습니다
        // 빈 병 a개를 가져다주면 
        // 콜라 b병을 주는
        int answer = 0;
        while(true){
            if(n<a){
                break;
            }
        // 가지고있는 빈병의 수가 a개보다 크면 시작
        answer += (n/a)*b;
        int remain = n%a;
        
        n=(n/a)*b+remain;
    }
        return answer;
    }
}

가지고있는 빈병의 수가 a개보다 미만일 경우와 이상일경우로 나누어서 처리하면 된다.
즉, a개보다 미만일 경우에는 리턴을하면되는거고, a개보다 이상일 경우에는 빈병을 기준인 a개로 나누어서 돌려받는 개수를 곱해주면된다.
그리고, 나머지를 구하고 빈병의 개수인 n에 위의 값과 나머지 병을 더해주는것을 while문을 돌리면된다.

이어붙인 수

참고사이트 : https://sigfriede.tistory.com/183

class Solution {
    public int solution(int[] num_list) {
        int answer = 0;
        String odd = "";
        String even = "";
        for(int i=0;i<num_list.length;i++){
            if (num_list[i]%2==0){
                even +=Integer.toString(num_list[i]);
            }else{
                odd +=Integer.toString(num_list[i]);
            }
        }
        answer = Integer.parseInt(even)+Integer.parseInt(odd);
;        return answer;
    }
}

먼저 'solution'이라는 클래스 이름을 선언한다. 그 다음 'solution'이라는 메소드를 선언한다. 이 메소드는 정수배열 (num_list)를 입력으로 받아 정수를 반환한다.
최종 짝수와 홀수의 합을 저장할 변수 'answer'를 초기화한다.
홀수를 문자열로 저장할 빈 문자열 odd를 초기화한다.
짝수를 문자열로 저장할 빈 문자열 even을 초기화한다.
배열 'num_list'의 각 요소를 순회하는 반복문을 시작한다.
반복문 내부에서는 현재 숫자가 짝수인지 확인하고, 만약 짝수라면 even뒤에 붙이고, 홀수라면 odd뒤에 붙인다.
'odd'와 'even'의 문자열을 정수로 반환하고, 그 합을 계산하여 'answer'에 할당한다.

마지막 두 원소

참고사이트 : https://velog.io/@peace_e/Java-%EB%A7%88%EC%A7%80%EB%A7%89-%EB%91%90-%EC%9B%90%EC%86%8C

num_list.length 보다 원소의 갯수가 하나 더 많은 int 배열 answer를 만들고, for문을 이용해 num_list의 원소를 그대로 받아왔다.
가독성을 위해서 마지막 원소, 마지막 원소에서 그 전 원소를 last, lastb라는 변수에 할당한다.
배열 answer 의 길이가 i라고 할 경우 배열 answer 의 원소는 answer[0]부터 answer[i-1]까지 있다.
따라서 answer의 마지막 원소는 answer[num_list.length]라고 작성해야한다.

약수의 합

class Solution {
    public static int solution(int n) {
        int answer = 0;
            for(int i=1;i<=n;i++){
                if(n%i==0){
                	System.out.println(i);
                    answer +=i;
            }
        }
        return answer;
    }
}
짝수와 홀수

class Solution {
    public String solution(int num) {
        if(num%2==0){
            return("Even");
        }else{
            return("Odd");
        }
    }
}
최댓값과 최솟값

참고사이트 : https://velog.io/@js4183/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.2-%EC%B5%9C%EB%8C%93%EA%B0%92%EA%B3%BC-%EC%B5%9C%EC%86%9F%EA%B0%92.java

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

split 메소드를 사용해서 문자열을 공백으로 나눠서 strArr 배열에 저장합니다. 그 다음, 문자열 배열을 정수형 배열로 변환하여 intArr 배열에 저장합니다.

max와 min을 초기값으로 intArr[0]으로 설정합니다. 그리고 for문을 사용하여 intArr 배열에서 최댓값과 최솟값을 찾습니다. 이를 위해서 각각의 값을 비교하여 max나 min의 값을 변경해줍니다.

JadenCase

class Solution {
    public static String solution(String s) {
        if(s==null||s.isEmpty()){
            return "";
        }
        String[] words = s.split("\\s+");
        StringBuilder result = new StringBuilder();
        for(String word : words){
            if(!word.isEmpty()){
                result.append(Character.toUpperCase(word.charAt(0)))
                .append(word.substring(1).toLowerCase())
                .append(" ");
            }
        }
        return result.toString().trim();
    }
}
        

입력이 비었거나 null이면 빈 문자열을 반환한다
문자열을 공백을 기준으로 나눈다
각 단어를 JadenCase로 변환한다
단어가 비어있지않으면 첫글자 대문자, 나머지는 소문자로 변환한다.
마지막에 공백이 추가되었을 경우에는 제거한다

최솟값 만들기

import java.util.Arrays;

class Solution
{
    public static int solution(int []A, int []B)
         
    {
        Arrays.sort(A);
        Arrays.sort(B);
        
        int answer = 0;
        
        for(int i=0;i<A.length;i++){
            answer += A[i] * B[B.length -1-i];
            
        }
        return answer;
    }

        // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
    public static void main(String[] args) {
        // 예시
        int[] A = {1, 4, 2};
        int[] B = {5, 4, 4};
        int answer = solution(A, B);
        System.out.println(answer);  // 출력: 29
    }
}

Arrays.sort(A);, Arrays.sort(B);
배열 A와 B를 오름차순으로 정렬한다
int answer = 0
결과를 저장할 변수 answer를 초기화한다.
이 결과는 각 단계에서 두 수를 곱한 값을 누적한 값이 된다.
answer += A[i] * B[B.length -1-i];
현재 인덱스 'i'에 위치한 각 배열의 값을 곱하여 결과에 더한다. B.length -1-i는 배열 'B'에서 역순으로 값을 가져오기 위한 인덱스이다.

이진변환 반복하기

참고사이트 : https://parkjye.tistory.com/81

	class Solution {
  public int[] solution(String s) {
    int[] answer = new int[2];
 
    while(s.length() > 1) {
 
      int cntOne = 0;
      for(int i=0; i<s.length(); i++) {
 
        if(s.charAt(i) == '0') answer[1]++;
        else cntOne++;
      }
 
      s = Integer.toBinaryString(cntOne);
      answer[0]++;
    }
 
    return answer;
  }
}

리턴할 answer 배열의 크기를 2로 선언
while()을 활용해서 입력받은 문자열 s의 길이가 1이 될 때까지 반복
1의 개수를 세어줄 int형 변수 cntOne을 선언
for()을 s의 길이만큼 돌립니다. 조건문을 활용해서 첫 번째 문자부터 0인지 확인
만약 0이면 answer[1]++를 하고 그렇지 않으면 cntOne++
(이진수라서 0이 아니면 무조건 1이기 때문)위에서 계산해둔 1의 개수를 toBinaryString()를 사용해서 이진수로 변경하고 s에 넣어둠
예시 1번에 따르면 1의 개수가 총 6개라서 cntOne이 6이 되어있고, 이를 이진수로 변경하면 110
이렇게 이진수로 변환할 때마다 answer[0]++
이렇게 s가 1이 될 때까지 계속 반복하면 이진 변환 횟수와 제거한 0의 개수를 확인할 수 있고 이를 리턴

profile
갓벽한 개발자

0개의 댓글