function solution1(friends, gifts) {
const len = friends.length
const nameMap = new Map()
const giftTable = new Array(len).fill(0).map((_) => new Array(len).fill(0))
const rankInfo = new Array(len).fill(0)
const nextMonth = new Array(len).fill(0)
friends.forEach((name, idx) => {
nameMap.set(name, idx)
})
gifts.forEach((info) => {
const [from, to] = info.split(' ')
giftTable[nameMap.get(from)][nameMap.get(to)]++
})
for (let i = 0; i < len; i++) {
rankInfo[i] = giftTable[i].reduce((acc, cur) => (acc += cur), 0)
for (let j = 0; j < len; j++) {
rankInfo[i] -= giftTable[j][i]
}
}
for (let i = 0; i < len; i++) {
for (let j = i + 1; j < len; j++) {
if (i === j) continue
if (giftTable[i][j] > giftTable[j][i]) nextMonth[i]++
if (giftTable[i][j] < giftTable[j][i]) nextMonth[j]++
if (giftTable[i][j] === giftTable[j][i]) {
if (rankInfo[i] > rankInfo[j]) nextMonth[i]++
if (rankInfo[i] < rankInfo[j]) nextMonth[j]++
}
}
}
return Math.max(...nextMonth)
}
function solution2(arr) {
let answer = []
let set = new Set(arr[0])
for (let i = 1; i < arr.length; i++) {
let curr = new Set(arr[i])
set = new Set([...set].filter((e) => curr.has(e)))
}
if (set.length !== 0) {
answer = Array.from(set).sort()
} else {
return answer
}
return answer
}
function solution3(n, s, t) {
let answer = ''
const text = '.'.repeat(n) + s + '.'.repeat(n - 1)
const duration = n + s.length
const time = t % duration
answer = text.substr(time, n)
return answer
}
function solution1(num) {
if (num % 4 === 1) {
return false
} else {
return true
}
}
function solution2(A) {
let minPrice = A[0]
let answer = 0
for (let i = 1; i < A.length; i++) {
answer = Math.max(answer, A[i] - minPrice)
minPrice = Math.min(minPrice, A[i])
}
return answer
}
function solution3(n) {
let answer = 0
for (let i = 0; i <= n; i++) {
answer += i
}
return answer
}
function solution1(n) {
const binaryString = n.toString(2)
let previousIndex = -1
let maxGap = 0
for (let i = 0; i < binaryString.length; i++) {
if (binaryString[i] === '1') {
if (previousIndex !== -1) {
const gap = i - previousIndex
maxGap = Math.max(maxGap, gap)
}
previousIndex = i
}
}
return maxGap
}
function solution2(s) {
const frequency = new Array(10).fill(0)
for (let char of s) {
const digit = parseInt(char)
frequency[digit]++
}
let maxFrequency = 0
let result = 9
for (let i = 0; i < 10; i++) {
if (frequency[i] > maxFrequency) {
maxFrequency = frequency[i]
result = i
} else if (frequency[i] === maxFrequency && i < result) {
result = i
}
}
return result
}
function solution3(nums, d) {
let answer = 0
for (let a = 0; a < nums.length; a++) {
for (let b = a + 1; b < nums.length; b++) {
if (nums[a] === nums[b] && nums[a] % d === 0) {
answer++
}
}
}
return answer
}
function solution1(s) {
let seen = new Set()
let maxLength = 0
let left = 0
for (let right = 0; right < s.length; right++) {
while (seen.has(s[right])) {
seen.delete(s[left])
left++
}
seen.add(s[right])
maxLength = Math.max(maxLength, right - left + 1)
}
return maxLength
}
function countOperations(s) {
let num = parseInt(s, 2)
let operations = 0
while (num > 0) {
if (num % 2 === 0) {
num /= 2
} else {
num -= 1
}
operations++
}
return operations
}
function solution3(S) {
const reversedChar = S.split('').reverse().join('')
if (reversedChar === S) {
return 1
} else {
return 0
}
}
function decimalToOtherBases(n) {
console.log(`10진수: ${n}`)
console.log(`2진수: ${n.toString(2)}`)
console.log(`8진수: ${n.toString(8)}`)
console.log(`16진수: ${n.toString(16)}`)
}
function otherBasesToDecimal() {
console.log(`2진수 "1010" -> 10진수: ${parseInt('1010', 2)}`)
console.log(`8진수 "52" -> 10진수: ${parseInt('52', 8)}`)
console.log(`16진수 "2a" -> 10진수: ${parseInt('2a', 16)}`)
}
function isPalindrome(s) {
const reversed = s.split('').reverse().join('')
return s === reversed
}
function isNumericPalindrome(n) {
const str = n.toString()
return isPalindrome(str)
}
function isPalindromeInBase(n, base) {
const converted = n.toString(base)
return isPalindrome(converted)
}
function isDoublePalindrome(n) {
const isDecimalPalindrome = isNumericPalindrome(n)
const isBinaryPalindrome = isPalindromeInBase(n, 2)
return isDecimalPalindrome && isBinaryPalindrome
}
function findDoublePalindromesInRange(start, end) {
const results = []
for (let i = start; i <= end; i++) {
if (isDoublePalindrome(i)) {
results.push(i)
}
}
return results
}
console.log('진수 변환 예제:')
decimalToOtherBases(42)
otherBasesToDecimal()
console.log('\n회문 관련 예제:')
console.log(`"abba"는 회문인가? ${isPalindrome('abba')}`)
console.log(`121은 10진수에서 회문인가? ${isNumericPalindrome(121)}`)
console.log(`585은 2진수에서 회문인가? ${isPalindromeInBase(585, 2)}`)
console.log('\n응용 문제:')
console.log(`585은 10진수와 2진수에서 모두 회문인가? ${isDoublePalindrome(585)}`)
console.log(
`10에서 1000 사이의 숫자 중 10진수와 2진수 모두 회문인 숫자: ${findDoublePalindromesInRange(10, 1000)}`
)
function longestPalindrome(s) {
let start = 0,
maxLength = 0
function expandAroundCenter(left, right) {
while (left >= 0 && right < s.length && s[left] === s[right]) {
left--
right++
}
return right - left - 1
}
for (let i = 0; i < s.length; i++) {
const len1 = expandAroundCenter(i, i)
const len2 = expandAroundCenter(i, i + 1)
const len = Math.max(len1, len2)
if (len > maxLength) {
maxLength = len
start = i - Math.floor((len - 1) / 2)
}
}
return s.substring(start, start + maxLength)
}
function minInsertionsForPalindrome(s) {
const n = s.length
const dp = Array.from({ length: n }, () => Array(n).fill(0))
for (let len = 2; len <= n; len++) {
for (let i = 0; i <= n - len; i++) {
const j = i + len - 1
if (s[i] === s[j]) {
dp[i][j] = dp[i + 1][j - 1]
} else {
dp[i][j] = Math.min(dp[i + 1][j], dp[i][j - 1]) + 1
}
}
}
return dp[0][n - 1]
}
function countPalindromeSubstrings(s) {
let count = 0
function expandAroundCenter(left, right) {
while (left >= 0 && right < s.length && s[left] === s[right]) {
count++
left--
right++
}
}
for (let i = 0; i < s.length; i++) {
expandAroundCenter(i, i)
expandAroundCenter(i, i + 1)
}
return count
}
function isPalindromeInBase(n, base) {
const converted = n.toString(base)
const reversed = converted.split('').reverse().join('')
return converted === reversed
}
function canFormPalindrome(s) {
const charCount = {}
for (const char of s) {
charCount[char] = (charCount[char] || 0) + 1
}
let oddCount = 0
for (const count of Object.values(charCount)) {
if (count % 2 !== 0) oddCount++
}
return oddCount <= 1
}
console.log('Longest Palindrome: ', longestPalindrome('babad'))
console.log('Min Insertions: ', minInsertionsForPalindrome('abca'))
console.log('Count Palindrome Substrings: ', countPalindromeSubstrings('aaa'))
console.log('Is Palindrome in Base 2: ', isPalindromeInBase(585, 2))
console.log('Can Form Palindrome: ', canFormPalindrome('civic'))
function solution1(p, s) {
const words = s.split(' ')
if (p.length !== words.length) {
return false
}
const pMap = {}
const usedWords = new Set()
for (let i = 0; i < p.length; i++) {
const char = p[i]
const word = words[i]
if (pMap[char]) {
if (pMap[char] !== word) {
return false
}
} else {
if (usedWords.has(word)) {
return false
}
pMap[char] = word
usedWords.add(word)
}
}
return true
}
function solution2(s) {
const words = s.split(' ')
const uniqueWords = new Set(words)
return uniqueWords.size
}
function solution3(s) {
const lowerCaseString = s.toLowerCase()
const alphabetSet = new Set()
for (let char of lowerCaseString) {
if (char >= 'a' && char <= 'z') {
alphabetSet.add(char)
}
}
return alphabetSet.size === 26
}
console.log('문제 1:', solution1('abba', 'dog cat cat dog'))
console.log('문제 1:', solution1('abba', 'dog cat cat fish'))
console.log('문제 2:', solution2('hello world world hello'))
console.log('문제 2:', solution2('a b c a b c'))
console.log('문제 3:', solution3('The quick brown fox jumps over the lazy dog'))
console.log('문제 3:', solution3('Hello World'))
function findCommonElements(arr1, arr2) {
let set1 = new Set(arr1)
let set2 = new Set(arr2)
let commonElements = []
set1.forEach((element) => {
if (set2.has(element)) {
commonElements.push(element)
}
})
return commonElements.sort((a, b) => a - b)
}
function countMutualFollows(followPairs) {
let followMap = {}
followPairs.forEach((pair) => {
let [follower, followee] = pair
if (!followMap[follower]) {
followMap[follower] = new Set()
}
followMap[follower].add(followee)
})
let mutualCount = 0
followPairs.forEach((pair) => {
let [follower, followee] = pair
if (followMap[followee] && followMap[followee].has(follower)) {
mutualCount++
}
})
return mutualCount / 2
}
function isMinHeap(arr) {
let n = arr.length
for (let i = 1; i <= Math.floor((n - 1) / 2); i++) {
let leftChild = 2 * i
let rightChild = 2 * i + 1
if (leftChild < n && arr[i] > arr[leftChild]) {
return 'NO'
}
if (rightChild < n && arr[i] > arr[rightChild]) {
return 'NO'
}
}
return 'YES'
}
function solution1(nums) {
let length = nums.length
let missingNumbers = []
let count = new Array(length + 1).fill(false)
for (let num of nums) {
if (num <= length) {
count[num] = true
}
}
for (let i = 1; i <= length; i++) {
if (!count[i]) {
missingNumbers.push(i)
}
}
return missingNumbers
}
function solution2(s) {
try {
let result = eval(s)
return result.toFixed(2)
} catch (e) {
console.error('잘못된 수식입니다.')
}
}
function solution3(s) {
let frequency = {}
for (let i = 0; i <= 9; i++) {
frequency[i] = 0
}
for (let char of s) {
frequency[char]++
}
let sortedNumbers = Object.keys(frequency).sort((a, b) => frequency[b] - frequency[a])
return sortedNumbers.join(' ')
}
function solution1(field, n) {
const rows = field.length
const cols = field[0].length
let maxPlants = 0
for (let i = 0; i <= rows - n; i++) {
for (let j = 0; j <= cols - n; j++) {
let currentPlants = 0
for (let k = 0; k < n; k++) {
for (let l = 0; l < n; l++) {
currentPlants += field[i + k][j + l]
}
}
maxPlants = Math.max(maxPlants, currentPlants)
}
}
return maxPlants
}
function solution2(arr) {
if (arr.length < 4) {
return 0
}
arr.sort((a, b) => b - a)
for (let i = 0; i <= arr.length - 4; i++) {
if (arr[i] < arr[i + 1] + arr[i + 2] + arr[i + 3]) {
return arr[i] + arr[i + 1] + arr[i + 2] + arr[i + 3]
}
}
return 0
}