알고리즘 코딩테스트 04 -배열의 유사도,K번째수 (JS)

조아라·2024년 10월 15일
1
post-thumbnail

배열의 유사도

문제 설명
두 배열이 얼마나 유사한지 확인해보려고 합니다. 문자열 배열 s1과 s2가 주어질 때 같은 원소의 개수를 return하도록 solution 함수를 완성해주세요.

제한사항
1 ≤ s1, s2의 길이 ≤ 100
1 ≤ s1, s2의 원소의 길이 ≤ 10
s1과 s2의 원소는 알파벳 소문자로만 이루어져 있습니다
s1과 s2는 각각 중복된 원소를 갖지 않습니다.
입출력 예
s1 s2 result
["a", "b", "c"]["com", "b", "d", "p", "c"] 2
["n", "omg"]["m", "dot"] 0

function solution(s1, s2) {
    const answer = s1.filter((str) => s2.includes(str));
    return answer.length;
}

filter메서드와 includes메서드를 사용해서 s1.filter((str) => s2.includes(str)) 배열 s1의 요소 중에서 s2 배열에도 포함된 요소들만 필터링했다. 필터링된 배열의 길이를 반환하여 공통 요소의 개수를 반환

선생님은 이중for문을 사용해서 풀어주셨다

const s1 = ["a", "b", "c"]
const s2 = ["com", "b", "d", "p", "c"]

function solution(s1, s2) {
	let answer = 0
	
	for (const word1 of s1) { 
			for (const word2 of s2) { 
				if(word1 === word2) answer++
			}
	}
	
	return answer
}

K번째수

문제 설명
배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.

예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면

array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
2에서 나온 배열의 3번째 숫자는 5입니다.
배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항
array의 길이는 1 이상 100 이하입니다.
array의 각 원소는 1 이상 100 이하입니다.
commands의 길이는 1 이상 50 이하입니다.
commands의 각 원소는 길이가 3입니다.
입출력 예
array
[1, 5, 2, 6, 3, 7, 4]
commands
[[2, 5, 3], [4, 4, 1], [1, 7, 3]]
return
[5, 6, 3]

function solution(array, commands) {
    const answer = [];
    commands.forEach(command => {
    let arr = array.slice(command[0] - 1, command[1]).sort((a, b) => a-b);  
    answer.push(arr[command[2] - 1])  
  })
      return answer;
}

아 이거 문제 보자마자 뭐라는거야? 했던것 같다ㅠㅠㅠㅠㅠㅠ
결국 중요한건 i번째부터 j번째까지 자르고 그걸 오름차순 한 뒤, k번째 인덱스수의 배열을 구해라.

여기서 주목해야 할 건 commands이다.[start,end,nth]를 잊어선 안되는 2차원 배열 문제였다. 인덱스 번호가 내가 구하고자 하는 것보다 -1되어야한다는 개념이 처음에 이해하기 어려웠다.

그리고 command[][] 이런식으로 주는것보다 앞에 변수를 선언하고, 그걸 넣어주는게 더 좋다고 하셨다. 그리고 문제에서 k j k라고 주어서 저렇게 선생님 코드처럼 선언했지만 스타트 포인트, 엔드 포인트인게 티가 나는 네이밍을 해주는게 나중에 코드 해석하기에 좋다고 하셨다.
j 0 1 2 i
[2, 5, 3] 0
[4, 4, 1] 1
[1, 7, 3] 2

같이 공부하시는 분이 이렇게 놓고 설명해주니까 이해가 잘가서 써놓는다 !
내가 제일 헷갈려하는 slice메서드 문제여서 주의깊게 보았고,
이걸 map으로 풀면 더 좋을거 같다는 생각이 들었다.

function solution(array, commands) {
  return commands.map(command => {
  let arr = array.slice(command[0] - 1, command[1]).sort((a, b) => a - b);
      return arr[command[2] - 1];
  });
}

map을 사용하면 새로운 배열이 반환된다고 생각하는 고차함수다.그러다보니까 요소를 걸러주고 원래의 길이가 같게 반환하니까, 그러다 보니까 map을 사용하는건 좋지 않다고 했다. forEhch를 사용하는것이 용도에 맞다고 하셨다.

이것도 선생님은

// [1, 5, 2, 6, 3, 7, 4]
// [[2, 5, 3], [4, 4, 1], [1, 7, 3]]
function solution(array, commands) {
	let answer = []
	
	for(const command of commands) {
		const i = command[0]
		const j = command[1]
		const k = command[2]
		
		const slicedArray = array.slice(i-1, j)
		slicedArray.sort((a,b)=> a - b)
		
		const targetNumber = slicedArray[k-1]
		answer.push(targetNumber)
	}
	
	return answer
}

이렇게 풀이 해주셨고,
확실히 코드가 이해가 잘됐다. 하나하나 인덱스로 선언해주고, 그걸 넣어서 오름차순. 편리한것같다.

profile
끄적 끄적 배운 걸 적습니다 / FRONT-END STUDY VELOG

0개의 댓글