enoch012 / JavaBasicStudy

Java 기초 스터디 (2023.09 ~ 10)
0 stars 1 forks source link

10월 29일 / 코딩테스트 연습(jaeyeon) #29

Open jaeyyyyy opened 11 months ago

jaeyyyyy commented 11 months ago

문제1

문제

입출력 예

names result
["nami", "ahri", "jayce", "garen", "ivern", "vex", "jinx"] ["nami", "vex"]

앞에서부터 5명씩 두 그룹으로 묶을 수 있습니다. ["nami", "ahri", "jayce", "garen", "ivern"], ["vex", "jinx"] 이 두 그룹에서 가장 앞에 서있는 사람들의 이름을 담은 리스트인 ["nami", "vex"]를 return합니다.

문제 풀이

마지막 그룹이 5명이 되지 않아도 가장 앞에 있는 사람의 이름을 포함한다는 점이 중요하다. name의 원소가 5의 배수인 경우와, 5의 배수가 아닌 경우에서 answer 배열의 길이가 달라진다. ArrayList를 사용할 거라면 배열의 길이를 설정하지 않아도 되지만 프레임워크를 쓰지 않으면서 코드를 작성해보려고 했다.

        int size;
        if(names.length % 5 == 0) {
            size = (names.length/5);
        } else {
            size = (names.length/5)+1;
        }

        String[] answer = new String[size];

코드 전체는 아래와 같다.

class Solution {
    public String[] solution(String[] names) {
        int size;
        if(names.length % 5 == 0) {  // name의 길이가 5의 배수이면
            size = (names.length/5);
        } else { // name의 길이가 5의 배수가 아니라면
            size = (names.length/5)+1; // size에 1을 더함
        }

        String[] answer = new String[size];
        int index = 0;

        for(int i = 0; i < names.length; i+=5) {
            answer[index++] = names[i];
        }
        return answer;
    }
}

회고

경우에 따라 배열 size의 값이 달라진다면 어떻게 코드로 구현을 해야하는지 고민을 했던 문제.

        int size = names.length / 5;
        if(names.length % 5 != 0){
            size += 1;
        }

~~라면 1만 더하면 되니까 이렇게 작성하는 게 더 간결하고 알아보기 쉬워보인다.

다른 사람의 코드를 참고했더니 삼항연산자로 배열의 선언과 동시에 배열의 크기를 초기화할 수도 있었다. 참고하려고 적어둔다. []안에 삼항연산자를 넣으면 된다.

String[] answer = new String[names.length % 5 == 0 ? names.length / 5 : names.length / 5 + 1];
jaeyyyyy commented 11 months ago

문제 2

문제

입출력 예

todo_list finished result
["problemsolving", "practiceguitar", "swim", "studygraph"] [true, false, true, false] ["practiceguitar", "studygraph"]

예제 1번의 todo_list 중에서 "problemsolving"과 "swim"은 마쳤고, "practiceguitar"와 "studygraph"는 아직 마치지 못했으므로 todo_list에서 나온 순서대로 담은 문자열 배열 ["practiceguitar", "studygraph"]를 return 합니다.

문제 풀이

todo_listfinished의 길이가 동일하다고 가정하고 코드를 작성했다.

import java.util.ArrayList;

class Solution {
    public String[] solution(String[] todo_list, boolean[] finished) {
        ArrayList<String> result = new ArrayList <>();
        for(int i = 0; i < todo_list.length; i++){
            if(finished[i] == false) { // 값이 false이면
                result.add(todo_list[i]); // todo_list[i]를 result에 추가한다.
            } 
        }
        String[] answer = new String[result.size()]; // result의 사이즈만큼 answer 배열을 만듦
        for (int i = 0; i < result.size(); i++) {
            answer[i] = result.get(i);
        }
        return answer;
    }
}

finished에 false인 값이 총 몇 개인지 모르니..편하게 값 추가하려고 ArrayList를 사용했다.

회고

  1. boolean 배열인 줄 모르고 처음에 equals('false') 라고 작성했다가 헤맸는데 그 부분만 수정하니까 쉽게 풀렸음. 어떤 자료형을 사용하는지 잘 봐야 한다. 문제를 제대로 읽어야겠다.
  2. if 문 안의 조건은 true 또는 false 값만 받으므로 (!finished[i])라고 작성해도 된다. 알고 있는데 자꾸 뒤에 값을 줘야할 것 같은 기분이 들어서 == false를 붙이게 됨..ㅋ습관을 고치자..
  3. ArrayList를 배열로 변환해서 출력하는 과정에 여러가지가 있다(for문,메서드 사용 등..)
        return result.toArray(new String[result.size()]);

    메서드 사용하면 이렇게 짧게 작성도 되는데, for문이 기본이되니까 for문으로 작성했었다.

  4. 풀고 나서 생각해보니 굳이 배열의 길이를 모른다는 이유로 ArrayList를 사용할 필요는 없었음. for문으로 복사하면 가능. 아래는 다른 사람의 코드를 참고한 것.
class Solution {
    public String[] solution(String[] todo_list, boolean[] finished) {
        String[] answer = {};
        String[] temp = new String[todo_list.length]; // todo_list 길이만큼 임시 배열 만들기

        int count = 0; // false인 갯수를 count
        for(int i=0; i<todo_list.length; i++){
            if(!finished[i]){
                temp[count++] = todo_list[i]; // 임시배열에 false인 값 추가하기 
            }
        }

        answer = new String[count]; // 임시배열의 유효한 값만 answer에 복사하기
        for(int i=0; i < count; i++){
            answer[i] = temp[i];
        }
        return answer;
    }
}
jaeyyyyy commented 11 months ago

문제 3

문제

입출력 예

numbers n result
[34, 5, 71, 29, 100, 34] 123 139
[58, 44, 27, 10, 100] 139 239

입출력 예 1

i numbers[i] sum
    0
0 34 34
1 5 39
2 71 110
3 29 139

예제 2번의 numbers의 마지막 원소 전까지의 원소를 sum에 더하면 139입니다. 139는 n 값인 139보다 크지 않고 마지막 원소인 100을 더하면 139보다 커지므로 239를 return 합니다.

문제 풀이

반복문을 사용해서 계속 더하게 한 다음, 조건을 만족하면 반복을 빠져나오게 하면 되는 간단한 문제다.

class Solution {
    public int solution(int[] numbers, int n) {
        int answer = 0;
        for(int i = 0; i < numbers.length; i++) {
            answer += numbers[i];
            if(answer > n) {
                break;
            }
        }
        return answer;
    }
}

회고

정말 간단한 문제인데 굳이 기록을 한 이유는 다른 사람의 풀이를 보면서 내가 for문을 제대로 활용을 못 하고 있었던 걸 깨달았기 때문..

for (초기치; 조건문; 증가치) {
    ...
}

for문은 위의 코드처럼 이루어진다. 보통 초기값 int i = a를 넣고, i가 b보다 작은(작거나 같은..등) 동안, i를 c만큼 증감하는데 조건문에 꼭 i에 대한 조건문이 들어가지 않아도 된다는 것.

class Solution {
    public int solution(int[] numbers, int n) {
        int answer = 0;

        for(int i = 0; answer <= n; i++) {
            answer += numbers[i];
        }

        return answer;
    }
}

그러니까 이런 코드도 가능하다는 얘기 분명히 이렇게 푼 적은 있었던 것 같은데 막상 사용하려고 하면 생각이 안 나서 먼 길 돌아가는 느낌이랄까.. 조건문을 이렇게 짜게 되면 굳이 반복문을 탈출할 필요가 없어진다.

jaeyyyyy commented 11 months ago

생성자와 this, this()에 대해 정리했습니다. 확실히 이해하려면 계속 정리해봐야 할듯 합니다..^^>;; https://velog.io/@peace_e/Java-%EC%83%9D%EC%84%B1%EC%9E%90%EC%99%80-thisthis