2024_08_29 Kata

SJ.CHO·2024년 8월 29일

알고리즘 Kata

57.

  • 답안 :

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

public class Solution {
	public int[] solution(int[] answers) {
		int[] stu1 = { 1, 2, 3, 4, 5 };
		int[] stu2 = { 2, 1, 2, 3, 2, 4, 2, 5 };
		int[] stu3 = { 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 };
		int stu1idx = 0, stu2idx = 0, stu3idx = 0;
		ArrayList<Integer> score = new ArrayList<>();
		ArrayList<Integer> answerls = new ArrayList<>();
		score.add(0);
		score.add(0);
		score.add(0);
		for (int i = 0; i < answers.length; i++) {
			if (stu1idx > stu1.length - 1) {
				stu1idx = 0;
			}
			if (answers[i] == stu1[stu1idx]) {
				score.set(0, score.get(0) + 1);
			}
			if (stu2idx > stu2.length - 1) {
				stu2idx = 0;
			}
			if (answers[i] == stu2[stu2idx]) {
				score.set(1, score.get(1) + 1);
			}
			if (stu3idx > stu3.length - 1) {
				stu3idx = 0;
			}
			if (answers[i] == stu3[stu3idx]) {
				score.set(2, score.get(2) + 1);
			}
			stu1idx++;
			stu2idx++;
			stu3idx++;
		}
		int max = Collections.max(score);
		for (int i = 0; i < 3; i++) {
			if (max == score.get(i)) {
				answerls.add(i + 1);
			}
		}
		int[] answer = new int[answerls.size()];
		for (int i = 0; i < answerls.size(); i++) {
			answer[i] = answerls.get(i);
		}
		return answer;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Solution s = new Solution();
		int[] answers = { 1, 3, 2, 4, 2 };
		System.out.println(s.solution(answers).toString());
	}
}
  • 알고리즘 설명 : 답안배열과 학생들의 찍기패턴배열의 idx가 다름으로 학생별 별도의 idx를 사용. 1개의 패턴이 끝날시 반복하도록 진행하였다.
    그 후 LIST를 이용하여 학생들의 점수를 채점하고 MAX값을 구해 별도의 순위 LIST를 구현하고 반환을 위한 answer 배열에 삽입후 리턴.
    크기가 다른 배열을 순회해야할때 별도의 idx를 사용하는것과 크기비교가 3개 이상일때 Collections 기능을 사용하는걸 숙지.

  • 코드보완 부분 : 별도의 idx를 이용하지않고 나머지값을 이용함으로 조금 더 깔끔한 코드가 완성됄수 있었음.

for(int i = 0; i < answers.length; i++){
            if(answers[i] == a[(i+1)%5]) arr[0]++;
            if(answers[i] == b[(i+1)%8]) arr[1]++;
            if(answers[i] == c[(i+1)%10]) arr[2]++;
        }

SQL Kata

53.

답안 :

SELECT USER_ID , PRODUCT_ID
FROM ONLINE_SALE 
GROUP BY 1, 2
HAVING COUNT(1) >= 2
ORDER BY 1, 2 DESC
  • 처음에는 중복값을 얻기위해 WHERE 절에 COUNT()함수를 사용해봤지만 바로 오류발생. WHERE 절에는 집계함수를 사용할수 없었다.
  • 방법을 찾아내던중 알아낸것이 GROUP BY로 행을 묶고 HAVING을 이용하는 방법 과 서브쿼리를 활용하는 방법. 그 중 GROUP BY를 활용하여 문제풀이.

54.

답안 :

SELECT MAX(DATETIME)
from ANIMAL_INS 
  • '최신'날짜를 구하는 문제기에 MAX()함수 사용. 보너스문제수준의 문제.

55.

답안 :

SELECT u2.USER_ID, u2.NICKNAME, concat(CITY,' ',STREET_ADDRESS1,' ',STREET_ADDRESS2) as '전체주소', CONCAT(substr(TLNO,1,3), '-', substr(TLNO,4,4), '-', substr(TLNO,8,4)) as '전화번호'
from USED_GOODS_BOARD u1
left join USED_GOODS_USER u2
on u1.WRITER_ID = u2.USER_ID
group by 1
HAVING count(1) >=3
order by 1 desc
  • 53번문제와 마찬가지로 중복값을 이용해야함으로 GROUP BY 와 HAVING을 사용해 중복값을 도출한 이후 String 데이터를 편집후 표기해야함으로 concat()함수를 사용해 편집. 전화번호의 경우 처음엔 FORMAT(TLNO,'###-####-####')의 방식을 사용하려 했으나 표기가 제대로 안되기에 substr을 사용하여 해결.
profile
70살까지 개발하고싶은 개발자

0개의 댓글