조건문, 반복문

2dean·2023년 5월 27일
0

Algorithm

목록 보기
4/17

문제 1

문제

정수 리스트 num_list가 주어질 때, 마지막 원소가 그전 원소보다 크면 마지막 원소에서 그전 원소를 뺀 값을 마지막 원소가 그전 원소보다 크지 않다면 마지막 원소를 두 배한 값을 추가하여 return하도록 solution 함수를 완성해주세요.

풀이

class Solution {
    public int[] solution(int[] num_list) {
         int[] answer = new int[num_list.length + 1];
        int last = 0;

        if(num_list[num_list.length-1] > num_list[num_list.length-2] ){
            last = num_list[num_list.length-1] - num_list[num_list.length-2];
        } else {
            last = num_list[num_list.length-1] * 2;
        }


        for (int j=0; j < num_list.length; j++){
            answer[j] = num_list[j];
        }
        answer[num_list.length] = last;
        

        return answer;
    }
}

문제 2

문제 : 수 조작하기1

정수 n과 문자열 control이 주어집니다. control은 "w", "a", "s", "d"의 4개의 문자로 이루어져 있으며, control의 앞에서부터 순서대로 문자에 따라 n의 값을 바꿉니다.

"w" : n이 1 커집니다.
"s" : n이 1 작아집니다.
"d" : n이 10 커집니다.
"a" : n이 10 작아집니다.
위 규칙에 따라 n을 바꿨을 때 가장 마지막에 나오는 n의 값을 return 하는 solution 함수를 완성해 주세요.

풀이

  int answer = 0;
        for (int i=0; i<control.length(); i++) {
            if("w".equals(String.valueOf(control.charAt(i)))) {
                n += 1;
            } else if ("s".equals(String.valueOf(control.charAt(i)))) {
                n -= 1;
            } else if ("d".equals(String.valueOf(control.charAt(i)))) {
                n += 10;
            } else if ("a".equals(String.valueOf(control.charAt(i)))) {
                n -= 10;
            }
        }
        answer = n;
        return answer;

실수

"s".equals(control.charAt(i)) 이렇게 썼을땐 조건문에 들어가지 못했는데

control.charAt(i)는 char 타입이므로, "s".equals(control.charAt(i))는 컴파일 오류가 발생합니다.
equals() 메서드는 문자열과 비교하려는 값을 문자열로 전달해야 합니다.
그래서 String.valueOf() 를 사용해 String으로 바꿔줬다


문제 3

문제 : 수 조작하기2

정수 배열 numLog가 주어집니다. 처음에 numLog[0]에서 부터 시작해 "w", "a", "s", "d"로 이루어진 문자열을 입력으로 받아 순서대로 다음과 같은 조작을 했다고 합시다.

"w" : 수에 1을 더한다.
"s" : 수에 1을 뺀다.
"d" : 수에 10을 더한다.
"a" : 수에 10을 뺀다.
그리고 매번 조작을 할 때마다 결괏값을 기록한 정수 배열이 numLog입니다. 즉, numLog[i]는 numLog[0]로부터 총 i번의 조작을 가한 결과가 저장되어 있습니다.

주어진 정수 배열 numLog에 대해 조작을 위해 입력받은 문자열을 return 하는 solution 함수를 완성해 주세요.

입출력예

logresult
[0, 1, 0, 10, 0, 1, 0, 10, 0, -1, -2, -1]"wsdawsdassw"

풀이

String solution(int[] numLog) {
        StringBuilder answer = new StringBuilder();
        // numLog[i]와 numLog[i+1] 을 비교해서 어떤 문자열을 입력받았는지 확인하기
        for (int i=0; i<numLog.length-1; i++) {
            int gap= 0;
            gap = numLog[i + 1] - numLog[i];
            System.out.println("numLog[i] : " + numLog[i]);
            System.out.println("numLog[i] : " + numLog[i] + " i+1 - i : " + (numLog[i + 1] - numLog[i]));
            if(gap == 1) {
                // 1을 더함
                answer.append("w");
            }
            if(gap == -1) {
                // 1을 뺌  s
                answer.append("s");
            }
            if(gap == 10) {
                // 10을 더함  d
                answer.append("d");
            }
            if(gap == -10) {
                answer.append("a");
                // 10을 뺌  a
            }
        }
        return answer.toString();
    }

잡담

머리가 안굴러가면 로그 찍어보는게 중요!


문제 4

문제 : 수열과 구간 쿼리 3

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [i, j] 꼴입니다.

각 query마다 순서대로 arr[i]의 값과 arr[j]의 값을 서로 바꿉니다.

위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해 주세요.

입출력 예

arrqueriesresult
[0, 1, 2, 3, 4][[0, 3],[1, 2],[1, 4]][3, 4, 1, 0, 2]

틀렸던 답

int[] solution(int[] arr, int[][] queries) {
        int[] answer = new int[arr.length];

        for (int i=0; i<queries.length; i++) {
            
            int arri = queries[i][0];
            int arrj = queries[i][1];
            // queries 의 순서대로 arr[i],arr[j]의 값을 바꿈
            for(int j=0; j<arr.length; j++){
                answer[i] =
                        arr[arri] = arrj;
                arr[arrj] = arri;
            }
        }
        return arr;
    }

이렇게 쓰면 queries 배열의 원소를 처리할 때, 반복문을 사용하지 않고 항상 동일한 arri와 arrj 값을 사용하게 된다!

풀이

 public int[] solution(int[] arr, int[][] queries) {
        int[] answer = arr.clone(); // arr 배열의 복사본 생성
        for (int i = 0; i < queries.length; i++) {
            int arri = queries[i][0];
            int arrj = queries[i][1];
            // arr[arri]와 arr[arrj]의 값을 서로 바꾸지 않고,
            // answer[arri]의 값과 answer[arrj]의 값을 바꿈
            int temp = answer[arri];
            answer[arri] = answer[arrj];
            answer[arrj] = temp;
        }
        return answer;
    }

기억할것

  • 배열의 원소 순서 바꾸는 방법
	int temp = arr[arri];
    arr[arri] = arr[arrj];
    arr[arrj] = temp;

문제 5

문제 : 수열과 구간 쿼리 2

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다.

각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 k보다 크면서 가장 작은 arr[i]를 찾습니다.

각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하는 solution 함수를 완성해 주세요.
단, 특정 쿼리의 답이 존재하지 않으면 -1을 저장합니다.

입출력 예

arrqueriesresult
[0, 1, 2, 3, 4][[0, 4, 2],[0, 3, 2],[0, 2, 2]][3, 4, -1]

풀이

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Solution {
    public int[] solution(int[] arr, int[][] queries) {
   List<Integer> answer = new ArrayList<>();

        for (int num=0; num<queries.length; num++){
            System.out.println("queries ["+num+"][0] : " + queries[num][0]);
            System.out.println("queries ["+num+"][1] : " + queries[num][1]);
            System.out.println("queries ["+num+"][2] : " + queries[num][2]);
            System.out.println("--------------------");
            int s = queries[num][0];
            int e = queries[num][1];
            int k = queries[num][2];

            System.out.println("s : " + s);
            System.out.println("e : " + e);
            System.out.println("k : " + k);


            List<Integer> list = new ArrayList<>();
            for(int i=s; i<=e; i++){
                if(arr[i]>k){
                    list.add(arr[i]);
                }
            }

            if(!list.isEmpty()){
                Collections.sort(list); // 오름차순 정렬
                answer.add(list.get(0));
            } else {
                answer.add(-1);
            }

        }

        int[] result = new int[answer.size()];
        for (int i=0; i<result.length; i++){
            result[i] = answer.get(i);
        }
        return result;
    }
}

                                  갈수록 어려워지네?;ㅎ
                                  
profile
냅다 써보는 공부의 흔적😇

0개의 댓글