오늘은 한 문제만 하고 책이나 읽으려고 나왔다. 근데 지금 첫 문제가 어떻게 풀어야될지 감도 안잡혀서 오래 풀 것 같다.
//중앙값은 어떤 주어진 값들을 크기의 순서대로 정렬했을 때 가장 중앙에 위치하는 값을 의미합니다.
//예를 들어 1, 2, 7, 10, 11의 중앙값은 7입니다. 정수 배열 array가 매개변수로 주어질 때,
//중앙값을 return 하도록 solution 함수를 완성해보세요.
class Solution {
public int solution(int[] array) {
int answer = 0;
return answer;
}
}
문제는 이런 문제인데 무작위의 배열의 값을 일단 오름차순으로 정리하는 코드가 필요할 것 같고, 거기서 중앙 값을 찾아주는 코드가 이차적으로 필요할 것 같은데. 일단 오름차순으로 정리하는 코드는 할 수 있을 것 같다.
오름차순 정렬은 검색하니까 바로 나왔다 코드 두줄로 바로 해결할 수 있을 것 같다.
import java.util.Arrays;
Arrays.sort(array);
util Arrars를 인포트 해주고 sort 기능을 사용하면 무작위의 숫자들을 오름차순으로 정렬해준다.
자 이제 문제는 랜덤한 숫자에서 중앙값을 정확히 구해야되는건데 이걸 어떻게 하는지 감이 아예 잡히지 않는다..
이중반복문을 사용해서 좌측에서 우측으로, 또 우측에서 좌측으로 가는 코드를 만들어볼까? 근데 그건 어떻게 해야되지.
뭐 일단 부딫혀봐야지 어떻게 하겠나.
아 코드를 쓰면서 뭔가 떠올랐다. 좌측 첫번째는 제일 작은 수일 것이다. 그게 음수일 수도 있고 뭐 하여튼 어쨌든 좌측 첫번째는 0번째 배열일거니까 일단 배열 0을 기준으로 잡고 시작, 우측 끝은 제일 큰 수일테니 array.lenth를 사용해서 찾아보면 되지 않을까? 일단 바로 해보자.
class Solution {
public int solution(int[] array) {
Arrays.sort(array);
// 배열 처음부터 끝까지 숫자 탐색
for(int i = array[0]; i <= 1000; i++){
//배열 끝에서부터 처음까지 숫자 탐색
for (int k = array.length; k >= -1000; k--){
if (i == k){ // 만약 i값과 k값이 같아진다면
return i; //그 값을 리턴 값으로 갖는다.
}
}
}
int answer = 0;
return answer;
}
}
이렇게 해봤다. 테스트 케이스 돌리러 ㄱㄱ.
음 일단 틀렸다. 당연히 틀릴거라고 생각은 했다. 이제부터 뭐가 문제인지 다시 생각하면 된다.
중앙값은 고사하고 배열의 값이 나오긴 한다. 근데 중앙이랑은 거리가 멀다. 배열의 끝 지점이 잘못됐을까?
아 그렇네. array.length가 배열끝의 값이 아니고 배열의 길이 자체라서 내가 원하는 값이 나오지 않는 것 같다. 배열의 끝의 값을 어떻게 불러올지만 생각하면 해결 될 것 같다.
class Solution {
public int solution(int[] array) {
Arrays.sort(array);
for (int i = array[0]; i <= 1000; i++) {
for (int k = array[array.length - 1]; k >= -1000; k--) {
if (i == k) {
return i;
}
}
}
int answer = 0;
return answer;
}
}
이렇게 수정은 했는데 같은 값이 나온다. 이유를 곰곰이 생각해보니까 반복문 안에서 좌측으로, 또 우측으로 배열 값이 이동할 수 있게끔 만들어줄 작업이 필요할 것 같다.(아닐 수도 있다.) 이렇게 생각한 이유가 배열 자체의 첫번째 값과 마지막 값밖에 가지지 못해서 결과 값이 배열의 첫번째 값이 계속 나오는 것 같다. 일단 수정하러 가보자.
class Solution {
public int solution(int[] array) {
Arrays.sort(array);
int y = 0;
int t = array[array.length - 1];
for (int i = array[0]; i <= 1000; i++) {
int x = array[y];
y++;
for (int k = array[array.length - 1]; k >= -1000; k--) {
t--;
if (x == t) {
return x;
}
}
}
int answer = 0;
return answer;
}
}
이렇게 수정해봤는데도 결과값은 같다.
한참 생각해보다가 답이 안나올 것 같아서 그냥 답을 한번 살펴봤다. 내 문제점은 배열 활용을 제대로 하지 못한게 문제다. 왜 배열의 값을 하나하나 다 확인하려고 했을까. 그냥 배열 자체 길이에서 중간 번수를 찾으면 됐던 문제다..
내가 문제를 못푼 이유는 index에 저장된 값을 하나하나 다 열어봐야된다고 생각했기 때문이였다. 생각해보면 정말 비효율적이다. 어차피 오름차순으로 저장했기 때문에 값들은 정렬이 되어있을거고, 거기서 우리는 배열순번의 중간을 찾으면 됐던거다. 이걸 생각하고 다시 코드를 짜보겠다.
class Solution {
public int solution(int[] array) {
// 배열을 오름차순으로 정렬
Arrays.sort(array);
//중앙값(배열순번의 중간)을 구하기 위해서 배열길이를 2로 나눔
int mid = array.length / 2;
return array[mid]; //중간값을 리턴.
}
}
ㅋㅋㅋ.. 코드 세줄이면 되는 문제였네 진짜 환장해버리겠다. 아무튼 지식이 늘었다.. 사고를 조금 더 다양하게 할 수 있었으면 좋겠다. 이제 책 읽으러 가야지!
'Coding History' 카테고리의 다른 글
2024.06.12 DNS가 뭔가요? + 도메인, A Record, CName (1) | 2024.06.12 |
---|---|
2024. 06. 11 문제풀이 (0) | 2024.06.11 |
2024. 06. 07 기본 개발용어 알아보기 (1) | 2024.06.07 |
2024. 06. 07 문제 풀이 (1) | 2024.06.07 |
2024. 06. 06 문제 풀이 (2) | 2024.06.06 |