22.11.04_모각코 3회차

2022. 11. 7. 15:27모각코

목표

- 객체지향프로그래밍 과제 10문제 풀기(과제 7)

내용

3. 1등과 2등의 차이

 
문제 설명

학생들의 성적이 입력될 때, 1등인 학생의 점수와 2등인 학생의 점수의 차를 계산하는 프로그램을 작성하세요.

(단, 1등인 학생이 2명인 경우 0을 리턴합니다.)

입출력 예
| scores | result |
|----------------|--------|
| [90,76,80,100] | 10 |
| [68,79,54,80] | 1 |
| [100,100,90,95]| 0 |

제한사항

효율성 테스트를 통과하기 위해서, 어레이를 정렬하지 않고 문제를 풀어야 합니다.

class Solution {
    public int solution(int[] scores) {
        int answer = 0, first = 0, second = 0;
        for (int k:scores) {
            if (k >= first) {
                second = first;
                first = k;
            } // 위 if문만 있을 경우 1등 점수가 먼저 나오고 2등 점수가 나오는 경우를 처리하지 못함
            if (k < first && k > second)
                second = k;
        }
        answer = first - second;
        return answer;
    }
}

5. 인적사항 정렬하기

 
문제 설명

국민대학교에서 서류를 정리하던 찬영이는 인적사항을 찾는데에 번거로움을 느꼈다.
어떤 서류에서는 나이순으로 정렬해주기를 바라고, 어떤 서류에서는 이름순으로 정렬해주기를 바라고, 어떤 서류에서는 학번순으로 정렬해주기를 바라는데 기존 데이터베이스에서는 학번순으로만 정렬이 되어있기 때문에 다른 경우에는 정리하기 번거롭기 때문이다.

때문에 찬영이는 자신의 능력을 발휘해서 기준에 따라서 정렬할 수 있는 데이터베이스로 업데이트 하기로 했다.

[학번, 나이, 듣는 과목의 개수] 순서대로 여러 인적사항들과 함께 정렬 기준이 입력으로 주어진다.

정렬 기준에 따라서 인적사항을 정렬하도록 해보자.

입출력 제한

  • 3 ≤ (인적사항의 개수) ≤ 1,000
  • 정렬기준은 0, 1, 2로 주어지며, 0은 학번, 1은 나이, 2는 듣는 과목의 개수를 기준으로 하겠다는 의미이다.
  • 정렬 기준에 따라 값을 비교하며 오름차순으로 정렬하되, 값이 같다면 0, 1, 2 순서대로 값을 추가적으로 비교해서 오름차순으로 정렬한다.

입출력 예시

입력값출력값
[[20201234, 20, 6], [20201111, 20, 7], [20193336, 21, 7], [20151628, 25, 5]], 0 [[20151628, 25, 5], [20193336, 21, 7], [20201111, 20, 7], [20201234, 20, 6]]
[[20151628, 25, 5], [20201234, 20, 6], [20201111, 20, 7], [20201111, 20, 6]], 1 [[20201111, 20, 6], [20201111, 20, 7], [20201234, 20, 6], [20151628, 25, 5]]
class Solution {
    public int[][] solution(int[][] info, int stand) {
        int[] s;
        for (int i=0; i<info.length; i++) {
            for (int j=info.length-1; j>i; j--) {
                if (info[i][stand] > info[j][stand]) {
                  s = info[i];
                  info[i] = info[j];
                  info[j] = s;
                } else if (info[i][stand] == info[j][stand]) {
                    for (int k=0; k<3; k++) {
                        if (info[i][k] > info[j][k]) {
                            s = info[i];
                            info[i] = info[j];
                            info[j] = s;
                            break;
                        } else if (info[i][k] == info[j][k]) {
                            continue;
                        } else {
                            break;
                        }
                    }
                    // ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
                    // 아래 주석처리한 코드들을 위 for문으로 대체하여 코드를 줄일 수 있음
                    // if (info[i][0] > info[j][0]) {
                    //     s = info[i];
                    //     info[i] = info[j];
                    //     info[j] = s;
                    // } else if (info[i][0] == info[j][0]) {
                    //     if (info[i][1] > info[j][1]) {
                    //         s = info[i];
                    //         info[i] = info[j];
                    //         info[j] = s;
                    //     } else if (info[i][1] == info[j][1]) {
                    //         if (info[i][2] > info[j][2]) {
                    //             s = info[i];
                    //             info[i] = info[j];
                    //             info[j] = s;
                    //         }
                    //     }
                    // }
                }
            }
        }
        return info;
    }
}

5. 생일 클래스 구현하기

 

문제 설명

다음 조건을 만족하는 Birthday 클래스를 구현하세요.

특별한 언급이 없다면, 접근 제한자는 public으로 설정 해주세요.

멤버변수

  • int타입의 변수 month, day, age 를 가집니다.
  • String타입의 변수 name 을 가집니다.

생성자

총 4개의 생성자를 구현해야 합니다.

1.Birthday(int month, int day, int age, String name)

입력 받은 값들로 멤버 변수를 초기화 해줍니다.

  • 단, 입력 받은 month 와 day가 유효한 값이 아닐 경우, month 와 day 모두 1로 초기화합니다. (예를들어, month = 1, day = 32로 입력되는경우.. 1월에는 31일까지만 존재하므로 유효한 값이 아닙니다. 따라서 month와 day의 값은 1로 초기화 해야 합니다.) (단, 2월은 윤년을 고려하지 않고 반드시 29일까지만 있다고 가정합니다.)
2.Birthday(int month, int day, int age )

name이 입력 되지 않는 경우

  • name을 "unknown"으로 초기화 합니다.
  • 이 생성자도 생성자1과 같이 month와 day가 유효한 값인지 판단하고, 그렇지 않다면 month와 day를 1로 초기화 해야 합니다.
3.Birthday(int month, int day)

age와 name이 입력되지 않는 경우

  • name 은 "unknown"으로, age 는 1로 초기화 합니다.
  • 역시, 올바르지 않은 month와 day가 입력 될 경우 month = 1, day = 1 로 초기화 되어야 합니다.
4.Birthday()

아무런 입력 인자가 없는 경우

  • month, day, age를 모두 1로 초기화 합니다.
  • name을 "unknown"으로 초기화 합니다.

주의!

모든 생성자에 month와 day가 올바른 값인지 검사하는 코드를 넣는 것은 비효율적이고, 코드가 불필요하게 길어집니다.

this() 를 사용하여 위와 같은 문제를 해결 하세요.

생성자1( 모든 멤버 변수의 값이 입력될 때 호출되는 생성자 ) 에서만 month와 day를 검사하고.

나머지 생성자 에서는 this() 를 이용하여, 생성자1을 호출하여 month와 day에 대한 예외 처리가 자동으로 이루어 지도록 코드를 작성하세요.

멤버함수

총 8개의 겟메소드와 셋메소드를 구현하세요.
//멤버 변수의 값을 리턴 하는 겟메소드

  • getMonth()
  • getDay()
  • getAge()
  • getName()

//멤버변수의 값을 입력 인자값으로 변경하는 셋메소드

  • setMonth(int month)
  • setDay(int day)
  • setAge(int age)
  • setName(String name)
//아래 코드는 지우지 마세요.
class Solution {
    public int solution(int param0) {
        int answer = 0;
        return answer;
    }
}

//아래 코드를 조건에 맞게 구현하세요.
class Birthday{
    int month, day, age;
    String name;
    public Birthday(int month, int day, int age, String name) {
        int[] days = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        this.month = 1;
        this.day = 1;
        if (month>=1 && month <=12) {
            if (day>=1 && day<=days[month]) {
                this.month = month;
                this.day = day;
            }
        }
        this.age = age;
        this.name = name;
    }
    public Birthday(int month, int day, int age) {
        this(month, day, age, "unknown");
    }
    public Birthday(int month, int day) {
        this(month, day, 1, "unknown");
    }
    public Birthday() {
        this(1, 1, 1, "unknown");
    }
    public int getMonth() {
        return month;
    }
    public int getDay() {
        return day;
    }
    public int getAge() {
        return age;
    }
    public String getName() {
        return name;
    }    
    public void setMonth(int month) {
        this.month = month;
    }
    public void setDay(int day) {
        this.day = day;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void setName(String name) {
        this.name = name;
    }
}

회고

- 9번 문제의 경우 처음엔 comparator를 사용하여 풀려고 했으나 코드를 이해하기 힘들고 출제의도에 어긋나는 것 같아서 다른 방법을 생각했다. 입력이 1000개 이하로 들어오는 것을 보고 시간 복잡도가 O(N^)이라도 괜찮을 것이다. 따라서 이중 for문을 통해 기본 알고리즘을 짜고 값이 같을 경우는 분기문으로 처리하였다.

- 10번 문제를 처음 봤을 땐 그동안 풀어왔던 문제와 형태가 달라서 당황했다. 하지만 이내 자바에서 중요한 생성자와 메소드를 만드는 문제라는 것을 깨닫고 this를 포함하여 배운 개념들을 써먹어 문제를 해결했다.

'모각코' 카테고리의 다른 글

22.11.25_모각코 6회차  (1) 2022.11.30
22.11.18_모각코 5회차  (0) 2022.11.30
22.11.11_모각코 4회차  (0) 2022.11.30
22.10.07_모각코 2회차  (0) 2022.10.10
22.09.30_모각코 1회차  (1) 2022.09.30