문제 출처
https://www.acmicpc.net/problem/1181
문제
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
단, 중복된 단어는 하나만 남기고 제거해야 한다.
입력
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
출력
조건에 따라 정렬하여 단어들을 출력한다.
예제 입력 1 복사
13
but
i
wont
hesitate
no
more
no
more
it
cannot
wait
im
yours
예제 출력 1 복사
i
im
it
no
but
more
wait
wont
yours
cannot
hesitate
문제 풀이 코드 1)
const input = require('fs').readFileSync('/dev/stdin').toString().split('\n');
const N = Number(input.shift());
let answer = [];
for(let i=0; i<N; i++){
if(!answer.includes(input[i])){
answer.push(input[i]);
}
}
answer = answer.sort((a,b) => {
if(a.length === b.length){
return a.localeCompare(b)
}else{
return a.length - b.length
}
})
console.log(answer.join('\n'))
//sort는 새로운 배열을 반환하나?
문제 풀이 코드2)
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
const N = parseInt(input.shift());
const words = new Set(input); // 중복 제거
const sortedWords = [...words].sort((a, b) => {
if (a.length !== b.length) {
return a.length - b.length; // 길이가 짧은 것부터 정렬
} else {
return a.localeCompare(b); // 길이가 같으면 사전 순으로 정렬
}
});
console.log(sortedWords.join('\n'));
기억하고갈 ppoint
01. sort : 원 배열이 정렬되는 것에 유의! 복사본이 만들어지는 것이 아닙니다.!
02. 원 배열이 정렬 되더라도
이런 식은 안됨
let answer = new Set(input)
[...answer].sort((a,b) => {
if(a.length === b.length){
return a.localeCompare(b)
}else {
return a.length-b.length
}
})
이런식으로 작성해줘야 함. !!
let answer = new Set(input)
answer = [...answer].sort((a,b) => {
if(a.length === b.length){
return a.localeCompare(b)
}else {
return a.length-b.length
}
})
03. a.localeCompare(b) : 사전순으로 정렬
04. spread 연산자 :
var parts = ["shoulders", "knees"];
var lyrics = ["head", ...parts, "and", "toes"];
// ["head", "shoulders", "knees", "and", "toes"]
var arr = [1, 2, 3];
var arr2 = [...arr]; // arr.slice() 와 유사
arr2.push(4);
// arr2 은 [1, 2, 3, 4] 이 됨
// arr 은 영향을 받지 않고 남아 있음
var obj1 = { foo: "bar", x: 42 };
var obj2 = { foo: "baz", y: 13 };
var clonedObj = { ...obj1 };
// Object { foo: "bar", x: 42 }
var mergedObj = { ...obj1, ...obj2 };
// Object { foo: "baz", x: 42, y: 13 }
04. new Set() :
- value값 만을 저장하며 중복을 허용하지 않는 Collection . 동일한 값은 1개만 가질 수 있습니다.
- value값으로 같은 객체가 들어올 경우에는 중복값으로 인지하지 않습니다.
- 대소문자를 구분하기 때문에, hi와 HI는 다른 값으로 인지합니다.
const empty = new Set();
console.log(empty); // Set(0) {}
const nums = new Set([1, 2, 3, 4, 5]);
console.log(nums); // Set(5) { 1, 2, 3, 4, 5 }
const str = new Set('HELLO');
console.log(str); // Set(4) { 'H', 'E', 'L', 'O' }
const objArr = new Set([
{name:'라이언',company:'kakao'},
{name:'브라운',company:'naver'},
{name:'프로도',company:'kakao'},
{name:'라이언',company:'kakao'},
{name:'펭수',company:'ebs'}
]);
console.log(objArr);
/* Set(5) {
{ name: '라이언', company: 'kakao' },
{ name: '브라운', company: 'naver' },
{ name: '프로도', company: 'kakao' },
{ name: '라이언', company: 'kakao' },
{ name: '펭수', company: 'ebs' }
} */
Set 메서드
- 요소 추가: Set.add(value)
const nums = new Set([1, 2, 3, 4, 5]);
nums.add(200);
console.log(nums); // Set(6) { 1, 2, 3, 4, 5, 200 }
- 요소 일부 삭제: Set.delete(value)
nums.delete(2);
console.log(nums); // Set(5) { 1, 3, 4, 5, 200 }
- 요소 존재 확인: Set.has(value)
const isChecked = nums.has(200);
console.log(isChecked); // true
- 요소 갯수 확인: Set.size
const checkSize = nums.size;
console.log(checkSize); // 5
- 요소 전체 삭제: Set.clear()
nums.clear();
console.log(nums); // Set(0) {}
Set 반복문 (for-of)
const strArr = new Set(['A', 'B', 'C', 'D', 'E']); // new Set('ABCDE') 일때도 결과는 같다
console.log(strArr); // Set(5) { 'A', 'B', 'C', 'D', 'E' }
for (const alphabet of strArr) {
console.log(alphabet); // A B C D E
}
for (const alphabet of strArr.keys()) {
console.log(alphabet); // A B C D E
}
for (const alphabet of strArr.values()) {
console.log(alphabet); // A B C D E
}
Set -> Array 변환
const names = new Set([ 'john', 'alice', 'john' ]);
console.log(names); // Set(2) { 'john', 'alice' }
const check1 = Array.from(names);
console.log(check1); // [ 'john', 'alice' ]
const check2 = [ ...names ];
console.log(check2); // [ 'john', 'alice' ]
'알고리즘 문제 풀기' 카테고리의 다른 글
백준 11726: 2 X n 타일링 - javascript(dp) (0) | 2024.03.05 |
---|---|
백준 7795: 먹을 것인가 먹힐 것인가 - javascript(이분탐색) (1) | 2024.03.05 |
백준 10828: 스택 - javascript (구현) (2) | 2024.03.05 |
백준 9095: 1, 2, 3 더하기 - javascript(dp) (0) | 2024.03.04 |
백준 24445: 알고리즘 수업 - 너비 우선 탐색2 (0) | 2024.02.29 |