2024_09_06 Kata

SJ.CHO·2024년 9월 6일

알고리즘 카타

63.

답안 :

package answer;

public class Solution {

	public String solution(String X, String Y) {
		String answer = "";
		StringBuffer sb = new StringBuffer();
		// 2개의 문자열 자릿수 검사
		int xarr[] = new int[10];
		int yarr[] = new int[10];
		for (int i = 0; i < X.length(); i++) {
			xarr[X.charAt(i) - '0']++;
		}
		for (int i = 0; i < Y.length(); i++) {
			yarr[Y.charAt(i) - '0']++;
		}
		// 겹치는 숫자를 확인하여 Buffer에 저장
		for (int i = 9; i >= 0; i--) {
			//두개의 자릿수중 겹치는 숫자만큼 반복문으로 삽입.
			int count = Math.min(xarr[i], yarr[i]);
			for (int j = 0; j < count; j++) {
				sb.append(i);
			}
		}
		// 겹치는 숫자가없을시
		if (sb.length() == 0) {
			answer = "-1";
			return answer;
			//0만있을경우
		} else if (sb.charAt(0) == '0') {
			answer = "0";
			return answer;
		}
		answer = sb.toString();
		return answer;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Solution s = new Solution();
		String x = "12321";
		String y = "42531";
		System.out.println(s.solution(x, y));
	}
}
  • 알고리즘 설명 : 2개의 배열을 통해 X와 Y가 가지고 있는 숫자와 갯수를 인덱스를 통해 파악.
    이후 i를 0~9 까지 역순하여 두 배열중 겹친 최소중복만큼 반복문으로 버퍼에 삽입.
    아래에서 예외처리를 해주고 문자열로 리턴. 큰수가 올수가있기에 String Buffer 활용

  • 틀린답안

  1. 위에 코드에서 집계를 아래코드 같은 형태로 하는 식으로 비교값을 고정값 N으로 줬기에 중복숫자에 대한 처리부문에서 실패.
if(x[i]>=1 && y[i]>=1){
sb.append();
}
  1. 3개의 List를 두고 값을 그대로 추출, 정렬 후 비교, 이후 리턴했지만 시간+중복처리에서 실패.
package answer;

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

public class Solution {

	public String solution(String X, String Y) {
		String answer = "";
		int zerocnt = 0;
		ArrayList<Character> xarr = new ArrayList<>();
		ArrayList<Character> yarr = new ArrayList<>();
		ArrayList<Character> barr = new ArrayList<>();
		for (int i = 0; i < X.length(); i++) {
			xarr.add(X.charAt(i));
		}
		for (int j = 0; j < Y.length(); j++) {
			yarr.add(Y.charAt(j));
		}
		Collections.sort(xarr);
		Collections.sort(yarr);
		if (xarr.size() < yarr.size()) {
			for (int i = 0; i < yarr.size(); i++) {
				for (int j = 0; j < xarr.size(); j++) {
					if (yarr.get(i).equals(xarr.get(j))) {
						barr.add(yarr.get(i));
						break;
					}
				}
			}
		} else {
			for (int i = 0; i < xarr.size(); i++) {
				for (int j = 0; j < yarr.size(); j++) {
					if (yarr.get(i).equals(xarr.get(j))) {
						barr.add(yarr.get(i));
						break;
					}
				}
			}
		}
		Collections.sort(barr, Collections.reverseOrder());
		if (barr.size() == 0) {
			answer = "-1";
		} else {
			for (char item : barr) {
				if (item == '0' && zerocnt == 0) {
					answer += item;
					zerocnt++;
				} else if (item != '0') {
					answer += item;
				}
			}
		}
		return answer;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Solution s = new Solution();
		String x = "12321";
		String y = "42531";
		System.out.println(s.solution(x, y));
	}
}
  • 숫자 비교연산은 숫자 그 자체를 사용하기보단 배열의 인덱스를 활용하면 더 가볍게 풀수있다.

SQL Kata

66.

답안 :

SELECT concat("/home/grep/src/",u2.BOARD_ID,"/",u2.FILE_ID,u2.FILE_NAME,u2.FILE_EXT) as 'FILE_PATH'
from USED_GOODS_BOARD u1
left join USED_GOODS_FILE u2
on u1.BOARD_ID = u2.BOARD_ID
where u1.VIEWS=(Select max(VIEWS) from USED_GOODS_BOARD )
order by 1 desc
  • max함수를 통해 조회수가 가장높은 게시글만 가져와 String문자열을 편집하면 완료.

67.

답안 :

select f1.FLAVOR
from FIRST_HALF f1
Inner join(select FLAVOR,sum(TOTAL_ORDER) as JULY_TOTAL_ORDER
from JULY
group by FLAVOR) j1
on f1.FLAVOR = j1.FLAVOR
order by f1.TOTAL_ORDER + JULY_TOTAL_ORDER desc
Limit 3
  • JULY 테이블의 데이터가 섞여있는 경우이기에 group by를 통해 한번 묶어주고 join을 하면 한번의 연산만으로도 결과를 구하기가 가능.

  • 대체적으로 서브쿼리를 잘사용하여 원하는데이터를 가공하는 작업이 주가 되는것 같다.

profile
70살까지 개발하고싶은 개발자

0개의 댓글