728x90
문제
https://www.acmicpc.net/problem/20006
풀이
이번 문제는 class를 이용해 풀이해 봤다.
딱 보고 대기방을 클래스로 하면 정렬이나 입장과 같은 동작을 메서드로 구현해 조금 더 가독성 좋은 코드를 만들 수 있을것 같았다.
각 대기방을 클래스로 구현해두고 입장 가능 여부, 입장과 같은 동작을 메서드로 구현했다.
이번 문제를 풀며 실수했던 것은 문자열을 sort 메서드를 이용해 정렬할 때는 숫자를 정렬할때 처럼 a - b가 아니라 서로 비교연산자를 이용해야한다는 것이다.
sortName() {
this.nameList.sort((a, b) => {
if (a[1] < b[1]) return -1;
if (a[1] > b[1]) return 1;
});
}
코드
const input = require("fs")
.readFileSync(
process.platform === "linux" ? "/dev/stdin" : __dirname + "/example.txt"
)
.toString()
.trim()
.split("\n")
.map((e) => e.trim());
const [p, r] = input.shift().split(" ").map(Number);
const roomList = [];
let answer = "";
class Room {
constructor(firstEnteredUserInfo, level, maxEnter) {
this.nameList = [firstEnteredUserInfo];
this.levelRange = [level - 10 < 0 ? 0 : level - 10, level + 10];
this.remainEnterCnt = maxEnter - 1;
this.roomState = this.remainEnterCnt > 0 ? "Waiting!" : "Started!";
}
checkCanStart() {
if (this.remainEnterCnt === 0) return (this.roomState = "Started!");
return;
}
checkCanEnter(level) {
if (
this.levelRange[0] <= level &&
level <= this.levelRange[1] &&
this.remainEnterCnt > 0
) {
return true;
} else return false;
}
enter(userInfo) {
this.nameList.push(userInfo);
this.remainEnterCnt -= 1;
this.checkCanStart();
}
sortName() {
this.nameList.sort((a, b) => {
if (a[1] < b[1]) return -1;
if (a[1] > b[1]) return 1;
});
}
}
const findCanEnterIndex = (level, roomList) => {
if (roomList.length > 0) {
const roomIndex = roomList.findIndex((room) => room.checkCanEnter(level));
return roomIndex;
} else return -1;
};
for (let i = 0; i < p; i++) {
const [level, name] = input[i].split(" ");
const enterIndex = findCanEnterIndex(+level, roomList);
if (enterIndex >= 0) {
roomList[enterIndex].enter([level, name]);
} else {
roomList.push(new Room([level, name], +level, r));
}
}
for (let room of roomList) {
answer += `${room.roomState}\n`;
room.sortName();
for (let name of room.nameList) {
answer += `${name.join(" ")}\n`;
}
}
console.log(answer);
728x90
'코딩 테스트 > 백준' 카테고리의 다른 글
[JS] 겹치는 건 싫어 (0) | 2025.04.17 |
---|---|
[JS] 12919_A와 B 2 (0) | 2025.04.10 |
[JS] 4659_비밀번호 발음하기 (0) | 2025.04.08 |
[JS]1956_운동 (0) | 2025.04.04 |
[JS] 2504_괄호의 값 (0) | 2025.03.20 |
728x90
문제
https://www.acmicpc.net/problem/20006
풀이
이번 문제는 class를 이용해 풀이해 봤다.
딱 보고 대기방을 클래스로 하면 정렬이나 입장과 같은 동작을 메서드로 구현해 조금 더 가독성 좋은 코드를 만들 수 있을것 같았다.
각 대기방을 클래스로 구현해두고 입장 가능 여부, 입장과 같은 동작을 메서드로 구현했다.
이번 문제를 풀며 실수했던 것은 문자열을 sort 메서드를 이용해 정렬할 때는 숫자를 정렬할때 처럼 a - b가 아니라 서로 비교연산자를 이용해야한다는 것이다.
sortName() {
this.nameList.sort((a, b) => {
if (a[1] < b[1]) return -1;
if (a[1] > b[1]) return 1;
});
}
코드
const input = require("fs")
.readFileSync(
process.platform === "linux" ? "/dev/stdin" : __dirname + "/example.txt"
)
.toString()
.trim()
.split("\n")
.map((e) => e.trim());
const [p, r] = input.shift().split(" ").map(Number);
const roomList = [];
let answer = "";
class Room {
constructor(firstEnteredUserInfo, level, maxEnter) {
this.nameList = [firstEnteredUserInfo];
this.levelRange = [level - 10 < 0 ? 0 : level - 10, level + 10];
this.remainEnterCnt = maxEnter - 1;
this.roomState = this.remainEnterCnt > 0 ? "Waiting!" : "Started!";
}
checkCanStart() {
if (this.remainEnterCnt === 0) return (this.roomState = "Started!");
return;
}
checkCanEnter(level) {
if (
this.levelRange[0] <= level &&
level <= this.levelRange[1] &&
this.remainEnterCnt > 0
) {
return true;
} else return false;
}
enter(userInfo) {
this.nameList.push(userInfo);
this.remainEnterCnt -= 1;
this.checkCanStart();
}
sortName() {
this.nameList.sort((a, b) => {
if (a[1] < b[1]) return -1;
if (a[1] > b[1]) return 1;
});
}
}
const findCanEnterIndex = (level, roomList) => {
if (roomList.length > 0) {
const roomIndex = roomList.findIndex((room) => room.checkCanEnter(level));
return roomIndex;
} else return -1;
};
for (let i = 0; i < p; i++) {
const [level, name] = input[i].split(" ");
const enterIndex = findCanEnterIndex(+level, roomList);
if (enterIndex >= 0) {
roomList[enterIndex].enter([level, name]);
} else {
roomList.push(new Room([level, name], +level, r));
}
}
for (let room of roomList) {
answer += `${room.roomState}\n`;
room.sortName();
for (let name of room.nameList) {
answer += `${name.join(" ")}\n`;
}
}
console.log(answer);
728x90
'코딩 테스트 > 백준' 카테고리의 다른 글
[JS] 겹치는 건 싫어 (0) | 2025.04.17 |
---|---|
[JS] 12919_A와 B 2 (0) | 2025.04.10 |
[JS] 4659_비밀번호 발음하기 (0) | 2025.04.08 |
[JS]1956_운동 (0) | 2025.04.04 |
[JS] 2504_괄호의 값 (0) | 2025.03.20 |