프로그래머스 H-Index 문제이다.
문제 설명 자체가 난해해서 이해가 어려웠는데, 예시로 나온게 하필 3이 포함되고 return 값이 3이어서 더 혼동이 갔었다.
citations를 오름차순으로 정렬하고 for문 내에서 다음 값과 비교를 하면서 카운팅을 했었는데
예시로 넣는 값들은 어느정도 충족을 했는데 실제 테스트 케이스에서 자꾸 오류가 났다.
그래서 해당 방식을 바꾸어보았는데
function solution(citations) {
let l = citations.length
let count = 0;
citations = citations.sort((a,b) => b - a)
for(let i = 0; i < l; i++){
if(citations[i] > i){
count++
}
}
return count
}
배열 자체를 내림차순으로 정렬을 한 후에 i번 인덱스 값이 i보다 클 경우에만 카운팅을 해주면서 값을 늘렸고 문제를 해결했다.
순서대로 정리를 해보면 예시 문제에서 우선 정렬
[6, 5, 3, 1, 0]
에서 6이 i = 0보다 크므로 count++
5가 i = 1 보다 크므로 count++
3이 i = 2 보다 크므로 count++
1은 i = 3 보다 작으므로 통과
다음과 같은 순서로 작동한다.
h번이라는 횟수에 집착을 하여 실패했었는데
내림 차순으로 정렬을 했으므로 i 자체가 해당 횟수와 연관지어져서
문제를 해결 할 수 있었다.
토너먼트 식 대진표 문제이다. 우선 N의 크기는 2의 지수 승으로 주어져서 예외사항은 고려하지 않아도 되었는데
처음에는 규칙을 발견할 수 없어서 A와 B의 값 차이의 절대값을 확인해서 비교하고 규칙을 찾으려 시도를 하다가 실패했다.
그런데 결국 인접한 두 명의 참가자가 대전을 해서 올라가는 형식이기 때문에 참가자 두명을 하나의 묶음으로 묶어주면서 카운팅을 해 나가면 어떨까 하는 생각이 들었다.
function solution(n,a,b)
{
let count = 0;
while(a != b){
a = Math.ceil(a/2)
b = Math.ceil(b/2)
count++
}
return count
}
while문을 통해서 a와 b가 같아질 때까지 a/2, b/2값을 해주었다.
최근들어 0레벨에서 입문 Day 문제들과
추가적으로 2레벨에서 문제 한, 두개씩을 풀고있는데
2레벨 문제들을 보니까 코드로 구현하는 것 보다
문제 자체에서 특정한 규칙을 찾거나 해결 방법을 떠올리는 것 자체가 더 어려운 것 같다.
관찰력과 유연한 사고 방식이 필요한 것 같아...ㅠ