본문 바로가기

TIL

슬기의 TIL - 2023.04.12

오늘은 알고리즘 4문제 풀고, 어노테이션 공부하고, Lombok에서 지원하는 @getter @setter 생성자 어노테이션들을 공부하고, 자바의 정석 ch2. 변수와 ch12 중 어노테이션을 완독했다.

Lombok에서 지원하는 어노테이션들은 옵시디언에 따로 정리해두었다.

모의고사

문제

더보기

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

 

[1차 코드]

더보기
class Solution {
    public int[] solution(int[] answers) {
        int[] answer = {};
        int[] one = {1,2,3,4,5};
        int[] two = {2,1,2,3,2,4,2,5};
        int[] three = {3,3,1,1,2,2,4,4,5,5};
        int[] score = {0,0,0};
        int max = 0;
        int count = 0;
        
        // 정답과 수포자가 찍은 정답이 같으면 score(정답수) 증가
        for(int i = 0; i < answers.length; i++) {
            if(one[i % 5] == answers[i])
                score[0] ++;
            if(two[i % 8] == answers[i])
                score[1] ++;
            if(three[i % 10] == answers[i])
                score[2] ++;
        }
        
        // 최대 정답수 찾기
        for(int i = 0; i < score.length; i++) {
            if(max < score[i]) {
                max = score[i];
            }
        }
        
        // 최대 정답자 수만큼 answer 배열 크기 할당하기 위한 반복문
        for(int i = 0; i < score.length; i++) {
            if(max == score[i]) {
                count++;
            }
        }
        
        // 최대 정답자 수만큼 answer 배열 초기화
        answer = new int[count];
        
        // 최고 정답자 answer 배열에 넣기
        for(int i = 0; i < score.length; i++) {
            if(max == score[i]) {
                answer[i] = i + 1; // !!count가 1개라서 answer 크기가 1일 수도 있는데, score가 3일 때 최대라면 i에 3이 들어가야 하니까 에러가 발생함!!
            }
        }
        
        return answer;
    }
}

 

[2차 코드]

더보기
import java.util.*;

class Solution {
    public int[] solution(int[] answers) {
        int[] answer = {};
        int[] one = {1,2,3,4,5};
        int[] two = {2,1,2,3,2,4,2,5};
        int[] three = {3,3,1,1,2,2,4,4,5,5};
        int[] score = {0,0,0};
        int max = 0;
        int count = 0;
        ArrayList<Integer> list = new ArrayList<Integer>();
        
        // 정답과 수포자가 찍은 정답이 같으면 score(정답수) 증가
        for(int i = 0; i < answers.length; i++) {
            if(one[i % 5] == answers[i])
                score[0] ++;
            if(two[i % 8] == answers[i])
                score[1] ++;
            if(three[i % 10] == answers[i])
                score[2] ++;
        }
        
        // 최대 정답수 찾기
        for(int i = 0; i < score.length; i++) {
            if(max < score[i]) {
                max = score[i];
            }
        }
        
        // 최대 정답자 수만큼 answer 배열 크기 할당하기 위한 반복문
        for(int i = 0; i < score.length; i++) {
            if(max == score[i]) {
                count++;
            }
        }
        
        // 최대 정답자 수만큼 answer 배열 초기화
        answer = new int[count];
        
        // 최고 정답자 answer 배열에 넣기
        for(int i = 0; i < score.length; i++) {
            if(max == score[i]) {
                list.add(i+1); // answer 인덱스 주는 게 번거로워서 list로 받아서 값 넘겨주기로 함
            }
        }
        
        // list에서 answer로 값 전달하기
        for(int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i);
        }
        
        return answer;
    }
}

 

+ 최고 정답자를 answer 배열에 넣는 과정에서 문제가 발생했다.

더보기
// 최고 정답자 answer 배열에 넣기
for(int i = 0; i < score.length; i++) {
	if(max == score[i]) {
		answer[i] = i + 1;
	}
}

최고 정답자 수만큼 count를 올려주고, count를 answer 배열 크기로 할당했는데

최고 정답자를 answer 배열에 넣는 과정에서 score가 최대인 i값이 answer배열의 크기보다 커지는 경우가 발했다.

예를들어 score가 [0, 0, 2]라면, 3번이 최대 정답수 2를 냈고, max는 2, 최대 정답자 수는 1명이니까 count는 1이다.

answer에 넣을 때 index를 i로 해서 넣으니까 max == score[i]가 되는 i = 2, 즉 answer[3]에 i+1 = 3이 들어가게 된다.

여기서 answer는 count만큼 크기가 주어지기 때문에 크기가 1인 배열인데, index3을 찾으려고 하니까 에러가 발생한다!

 

case문을 써서 정답자가 1명일때, 2명일때, 3명일때마다 조건을 나눠 해결해보려고 했는데 2명일 때는 1,2번이 최고점일때, 2,3번이 최고점일때, 1,3번이 최고점일때 코드가 달라져야 하는 문제가 생겼다.

 

결국 돌고 돌아 최고 정답자를 list로 받아서 answer배열에 옮겨주는 방식으로 해결했다.

처음부터 list를 생각했다면 금방 풀었을 문제를 1시간이나 붙잡고 있었다.

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

문제는 sort와 어제 배운 Collections.reverse를 사용해 해결했다.

+ 사전 순서대로 알파벳을 정렬할 때, 모든 대문자가 소문자보다 먼저 온다는 것을 알게 되었다!

 

문자열 내 마음대로 정렬하기

문제

더보기

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.

 

먼저 아이디어!

strings 리스트에서 단어를 각각 가져와 한 글자씩 나눠 n번째 글자를 가져온다.

가져온 글자를 단어 맨 앞에 붙여서 새로운 list에 추가한다. (usun, ebed, acar 처럼 저장되도록)

그리고 리스트를 오름차순으로 정렬한다. (앞에서 계속 사용한 Collections.sort 이용)

answer 배열을 리스트 크기만큼 할당하고, 새로 붙여준 글자를 제외하고 두번째 글자부터 마지막 글자까지 추가한다.

 

+

문자.charAt(n) : 문자에서 n번째 글자 가져오기

substring(시작지점, 끝지점) : 문자에서 원하는 부분 잘라오는 메소드

'TIL' 카테고리의 다른 글

슬기의 TIL - 2023.04.14  (0) 2023.04.14
슬기의 TIL - 2023.04.13  (0) 2023.04.13
슬기의 TIL - 2023.04.11  (0) 2023.04.11
슬기의 TIL - 2023.04.10  (0) 2023.04.11
슬기의 TIL - 2023.04.08  (0) 2023.04.08