문제설명
n번의 테스틀 거쳐서, 멘토와 멘티를 정하려고 한다.
멘토는 모든 시험에서 멘티보다 등수가 높아야한다.
n번의 테스트결과가 주어지면 멘토와 멘티가 정해지는 경우는 몇 가지 인지 출력해라.
const arr = [
[3, 4, 1, 2],
[4, 3, 2, 1],
[3, 1, 4, 2],
];
console.log(solution(arr))
위의 경우에서 첫번째 테스트 결과는
3번학생이 1등, 4번학생이 2등, 1번학생이 3등, 2번학생이 4등이다.
접근방법
for문을 여러번 돌려야 겠다는 건 대충 직감적으로 왔다.
하나하나 다 비교를 하기 위해,
무려 4중 for문을 이용해
i번 학생과 j번 학생을 지정하고
i의 k번째 테스트의 등수(s)를 grade1 에 할당하고
j의 k번째 테스트의 등수(s)를 grade2에 할당해 준다.
grade1이 grade2 보다 작으면(=k 번째 테스트에서 i가 j 보다 등수가 높으면)
count에 1을 더 해준다.
n번의 테스트를 모두 확인했을 때,
count와 n이 일치하면(=n번의 테스트 모두 i 가 j보다 등수가 높으면)
answer에 1을 더해준다.
이런 식으로 모든 조합을 확인해줬다.
function solution(arr) {
let answer = 0;
const numOfStudent = arr[1].length;
const numOfTest = arr.length;
for (let i = 1; i <= numOfStudent; i++) {
for (let j = 1; j <= numOfStudent; j++) {
let grade1 = 0;
let grade2 = 0;
let match = 0;
for (let k = 0; k < numOfTest; k++) {
for (let s = 0; s < numOfStudent; s++) {
if (arr[k][s] === i) {
grade1 = s;
}
if (arr[k][s] === j) {
grade2 = s;
}
}
if (grade1 < grade2) match += 1;
}
if (match === numOfTest) answer += 1;
}
}
return answer;
}
const arr = [
[3, 4, 1, 2],
[4, 3, 2, 1],
[3, 1, 4, 2],
];
console.log(solution(arr));
for 문이 4개라 조금 복잡하다.
한 구다리씩 확인을 해보자.
function solution(arr) {
let answer = 0;
const numOfStudent = arr[1].length;
const numOfTest = arr.length;
학생수를 나타내는 변수를 선언하고 할당하고
테스트 횟수를 나타내는 변수를 선언하고 할당했다.
answer에는 일단 무지성으로 0을 할당했다.
function solution(arr) {
let answer = 0;
const numOfStudent = arr[1].length;
const numOfTest = arr.length;
for (let i = 1; i <= numOfStudent; i++) {
for (let j = 1; j <= numOfStudent; j++) {
let grade1 = 0;
let grade2 = 0;
let match = 0;
우선 앞에 두개의 for문을 통해
모든 학생을 i 번 학생과 j번 학생을 하나하나 확인할 수 있게 조건을 설정한다.
grade1 과 grade2, match는 for문이 돌때 마다 초기화를 위해 0을 할당해준다.
function solution(arr) {
let answer = 0;
const numOfStudent = arr[1].length;
const numOfTest = arr.length;
for (let i = 1; i <= numOfStudent; i++) {
for (let j = 1; j <= numOfStudent; j++) {
let grade1 = 0;
let grade2 = 0;
let match = 0;
for (let k = 0; k < numOfTest; k++) {
for (let s = 0; s < numOfStudent; s++) {
if (arr[k][s] === i) {
grade1 = s;
}
if (arr[k][s] === j) {
grade2 = s;
}
}
if (grade1 < grade2) match += 1;
}
if (match === numOfTest) answer += 1;
}
}
return answer;
}
const arr = [
[3, 4, 1, 2],
[4, 3, 2, 1],
[3, 1, 4, 2],
];
console.log(solution(arr));
for문 두개를 더 이어붙인다.
k는 몇번째 테스트인지, s는 해당 테스트의 등수를 확인할 수 있다.
arr[k][s]가 i와 일치하면, grade1 에 s를 할당하고
arr[k][s]가 j와 일치하면, grade2에 s를 할당한다.
grade1이 grade2보다 낮으면 match에 1을 더해준다.
마지막으로 match와 테스트 횟수가 일치하면 answer에 1을 더해준다.
위 입력 예제의 경우
출력되는 값은 3이고,
멘토링이 이뤄지는 경우는 (3,1) , (3,2) , (4,2)이다.
'문제풀이 > 인프런 알고리즘 문제풀이' 카테고리의 다른 글
4-5 k번째 큰수 (0) | 2021.12.20 |
---|---|
4-4 졸업선물 (0) | 2021.12.20 |
4-2 뒤집은 소수 (0) | 2021.12.14 |
4-1 자릿수의 합 (0) | 2021.12.14 |
격자판 최대합 (0) | 2021.12.10 |
댓글