https://programmers.co.kr/learn/courses/30/lessons/42862
코딩테스트 연습 - 체육복
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번
programmers.co.kr
소스 코드
파이썬
def solution(n, lost, reserve):
real_lost = set(lost) - set(reserve)
real_reserve = set(reserve) - set(lost)
answer = n - len(real_lost)
for people in real_lost:
if people - 1 in real_reserve:
answer += 1
real_reserve.remove(people - 1)
continue
if people + 1 in real_reserve:
answer += 1
real_reserve.remove(people + 1)
return answer
자바스크립트
function solution(n, lost, reserve) {
var answer = 0;
let students = {}
for (let i = 1; i <= n; i++) {
students[i] = 1
}
lost.forEach(number => students[number] -= 1)
reserve.forEach(number => students[number] += 1)
for (let i = 1; i <= n; i++) {
if (students[i] === 2 && students[i-1] === 0) {
students[i-1] += 1
students[i] -= 1
} else if (students[i] === 2 && students[i+1] === 0) {
students[i+1] += 1
students[i] -= 1
}
}
for (let keys in students) {
if (students[keys] >= 1) {
answer += 1
}
}
return answer;
}
풀이 과정
파이썬: set의 차집합 연산을 사용하여 lost, reserve에 둘 다 포함되어 있는 학생은 두군데에서 다 제외하고, 답의 초기값을 학생수 - 체육복을 도난 당한 학생수로 설정하였다. 그리고 lost에 속한 학생 번호의 왼쪽, 오른쪽을 순서대로 보면서 reserve에 포함되어 있는 학생이 있으면 체육복을 빌려오고 답의 개수를 1 증가시켰다.
자바스크립트: 일단 학생들이 체육복을 하나씩 갖고 있다고 가정하고, lost와 reserve 배열을 보면서 체육복의 개수를 하나 줄이거나 늘렸다. 그 후 2개 가지고 있는 사람의 왼쪽, 오른쪽을 순서대로 보면서 체육복이 없는 사람에게 체육복을 하나 빌려주었고, 체육복을 하나 이상 갖고 있는 학생의 수를 답으로 도출했다.
'알고리즘 문제 풀이 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 약수의 개수와 덧셈 [파이썬] (0) | 2022.05.11 |
---|---|
프로그래머스 - 폰켓몬 [파이썬] (0) | 2022.05.09 |
프로그래머스 - K번째수 [파이썬] [자바스크립트] (0) | 2022.05.08 |
프로그래머스 - 모의고사 [파이썬] [자바스크립트] (0) | 2022.05.07 |
프로그래머스 - 완주하지 못한 선수 [파이썬] [자바스크립트] (0) | 2022.05.07 |