등수구하기
N(1<=N<=100)명의 학생의 국어점수가 입력되면 각 학생의 등수를 입력된 순서대로 출력하는 프로그램을 작성하세요.
▣ 입력설명
첫 줄에 N(3<=N<=1000)이 입력되고, 두 번째 줄에 국어점수를 의미하는 N개의 정수가 입력
된다. 같은 점수가 입력될 경우 높은 등수로 동일 처리한다. 즉 가장 높은 점수가 92점인데
92점이 3명 존재하면 1등이 3명이고 그 다음 학생은 4등이 된다.
▣ 출력설명
입력된 순서대로 등수를 출력한다.
▣ 입력예제 1
5
87 89 92 100 76
▣ 출력예제 1
4 3 2 1 5
N(1<=N<=100)명의 학생의 국어점수가 입력되면 각 학생의 등수를 입력된 순서대로 출력하는 프로그램을 작성하세요.
▣ 입력설명
첫 줄에 N(3<=N<=1000)이 입력되고, 두 번째 줄에 국어점수를 의미하는 N개의 정수가 입력
된다. 같은 점수가 입력될 경우 높은 등수로 동일 처리한다. 즉 가장 높은 점수가 92점인데
92점이 3명 존재하면 1등이 3명이고 그 다음 학생은 4등이 된다.
▣ 출력설명
입력된 순서대로 등수를 출력한다.
▣ 입력예제 1
5
87 89 92 100 76
▣ 출력예제 1
4 3 2 1 5
위 코드는 주어진 배열 arr에서 각 요소가 몇 번째로 작은 요소인지를 찾아서,
그 결과를 배열 result에 저장하는 문제이다.
📌작성코드
<html>
<head>
<meta charset="UTF-8">
<title>출력결과</title>
</head>
<body>
<script>
function solution(arr) {
let answer = [];
let count = 1; //기본 값은 1등이여야하니까 1로 초기값 세팅
for (let i = 0; i < arr.length; i++) { //87점기준으로 한명씩 돌면서 for문에 넣어줌
count = 1; //사람이 바뀔때마다 카운터 다시 세팅
for (let j = 0; j < arr.length; j++) { //나를 제외한 모든 사람과 비교
if (arr[i] < arr[j]) { //조건문에 부합하면 실행
count = count + 1 //j+1
} else if (!(arr[i] < arr[j])) {
answer[i] = count
}
}
}
return answer;
}
let arr = [87, 89, 92, 100, 76];
console.log(solution(arr));
</script>
</body>
</html>
문제에서원하는 건, 87과 89/ 87,92/ 87,100/ 87,76....으로 순차적으로 비교하는 것으로
이중for문을 사용해서 만들어주었다.
두번째 for문에서 j=0인 이유는, 처음에는 단순하게 87,89/87,92...이렇게 비교해야하기 때문에
j=0부터 시작하면 불필요한 리소스라고 생각하고, j=1로 세팅했다.
하지만 다시 한번 생각해보니, 우리가 비교해주는 값들은 각각의 숫자에 대한 count 값이기때문에
87부터 순차적으로 모든 배열을 다 돌고나면, 다시 89부터 순차적으로 모든 배열을 비교해줘야한다는 점을 알았다.
j=1이면 맨 앞에있는 87은 비교가 되지않기때문에 당연히 다른 결과값을 반환하게 된다.
!arr[i] < arr[j]라는 조건은 (arr[i] < arr[j])를 부정한 것으로 해석된다.
하지만, 부정 연산자인 !는 < 연산자보다 우선순위가 높기 때문에, arr[i]가 0 또는 falsy한 값인 경우,
부정 연산자가 먼저 적용되어 true가 되고, 이후에 < 연산자가 적용되어 잘못된 결과가 반환된다.
따라서, else if 부분의 조건은 !(arr[i] < arr[j])와 같이, 부등호와 부정 연산자를 모두 괄호로 묶어줘야한다.
!arr[i] < arr[j] 는 결과적으로 arr[i] >= arr[j] 와 같은 의미이다.
위 코드의 문제점 result 배열이 초기화되지 않았기 때문에 result 배열에 값을 할당하기 전까지는 undefined 값이 할당되어 출력 결과가 원하는 것과 다르게 나타난다.
예를 들어, arr=[1,100,87] 이있고, i가 0이고, j가 0일 때 조건문에서 count는 1로 초기화됩니다.
이후, j가 1일 때, arr[i] < arr[j] 조건에 부합하여 count가 2가 됩니다.
그러나, j가 2일 때, arr[i] < arr[j] 조건에 부합하지 않으므로, result[0]에 count 값인 2가 할당되어야 합니다. 하지만, result[0]은 초기화되어 있지 않기 때문에, undefined가 할당되어 결과값이 [1, 1, 2]와 같이 나타나게 됩니다.
따라서, result 배열을 for문 내에서 초기화해주어야 합니다.
2차 풀이(23.04.05) 📍
function solution(arr) {
let result = [];
for (let i = 0; i < arr.length; i++) {
let count = 1;
for (let j = 0; j < arr.length; j++) {
if (arr[i] < arr[j]) {
count++;
}
}
result[i] = count;
}
return result;
}
let arr = [1, 100, 76];
console.log(solution(arr)); // [3, 1, 2]
위에서 풀었던 문제에서 else if (!(arr[i] < arr[j])) 조건을 사용하게 되니,
오류가 발생하는 것 같아 수정하였다.
'알고리즘' 카테고리의 다른 글
[알고리즘 문제] 3-1번 (0) | 2022.06.08 |
---|---|
[알고리즘 문제] 2-6번 (0) | 2022.06.07 |
[알고리즘 문제] 2-4번 (0) | 2022.06.02 |
[알고리즘 문제] 2-3번 (0) | 2022.06.02 |
[알고리즘 문제] 2-2번 (0) | 2022.06.02 |