더해야할 분수가 분모/분자 각 4개의 정수로 구해졌을 때
더하고 기약분수로 반환해야 한다!!!
분수 더하기
분모들 두개 곱해서 통분하여 구해줬다.
기약분수 구현
재귀함수를 통해 계속해서 나눠줬다.
const minimize = (numer1, denom1) =>{
//작은수를 target으로 해주기
let res1 = numer1;
let res2 = denom1;
const target = Math.min(numer1, denom1)
if (target === 1){
return [res1, res2]
}
for (divi = 2; divi <= target; divi++){
if (numer1 % divi === 0 && denom1 % divi === 0){
//minimize 가능할 때
return minimize(numer1 / divi, denom1 / divi)
}
}
return [res1, res2]
}
function solution(numer1, denom1, numer2, denom2) {
var answer = [];
answer = [...minimize(numer1 * denom2 + numer2 * denom1, denom1 * denom2)]
return answer;
}
call 배열에 따라서 players를 SWAP(추월) 해주면된다.
직관적으로 2중 FOR문으로 해결해줄 수 있다.
callings 배열의 최대길이 100만
players 배열의 최대길이 5만
연산 횟수는 최대 500억번이 된다.
따라서
players의 inder를 map자료구조에다가 넣고
꺼내기를 반복해서 시간복잡도 목표를 구현했다!!!
function solution(players, callings) {
var answer = [...players];
const playerMap = new Map();
// players 배열을 Map에 저장
for (let i = 0; i < players.length; i++) {
playerMap.set(players[i], i);
}
for (let target of callings){
const idx = playerMap.get(target);
//SWAP
let tmp = answer[idx - 1]
answer[idx-1] = answer[idx]
answer[idx] = tmp
playerMap.set(answer[idx], idx);
playerMap.set(answer[idx-1], idx-1);
}
return answer;
}
문제 조건규칙에 맞게 암호를 출력해내면 된다.
1) skippedList를 따로 만둠
2) 비암호화된 문자열을 선형 탐색으로 매개변수의 숫자만큼 shift해준후
3) 암호화된 문자열을 만들어줌
function solution(s, skip, index) {
var answer = '';
let skippedList = []
//skippedList 완성
for(let letter = 'a'; letter <= 'z'; letter = String.fromCharCode(letter.charCodeAt(0) + 1)){
if (!skip.includes(letter)){
skippedList.push(letter)
}
}
[...s].forEach((el)=>{
let afterIndex = 0
const befIndex = skippedList.indexOf(el)
if(befIndex + index >= skippedList.length){
afterIndex = (befIndex + index) % skippedList.length
}else{
afterIndex = befIndex + index
}
answer += skippedList[afterIndex]
})
return answer;
}
문제에 나와있는 7단계를 그대로 구현하면 다
하드코딩....
function solution(new_id) {
let answer = '';
const smallChar = []
const largeChar = []
for (let i = 0; i <= 25; i++ ){
smallChar.push(String.fromCharCode(97+i))
largeChar.push(String.fromCharCode(65+i))
}
//유효 문자
const validChar = [...smallChar, '-', '_', '.', '0','1'
,'2','3','4','5','6','7','8','9']
//1단계 대문자 => 소문자
for(let i = 0; i < new_id.length; i++){
if (largeChar.includes(new_id[i])){
const idx = largeChar.indexOf(new_id[i])
// new_id[i] = smallChar[idx]
answer += smallChar[idx]
}else{
answer += new_id[i]
}
}
new_id = answer
answer = ''
//2단계 유효문자 제외 제거
const delteIdx = []
for(let i = 0; i < new_id.length; i++){
if (validChar.includes(new_id[i])){
answer += new_id[i]
}
}
new_id = answer
answer = ''
// 3단계 '.' 두번이상시 제거
for(let i = 0; i < new_id.length-1; i++){
if (new_id[i] === '.' && new_id[i+1] === '.'){
//None
}else{
answer += new_id[i]
}
}
answer += new_id[new_id.length-1]
console.log(new_id[new_id.length-1])
new_id = answer
answer = ''
//4단계 처음이나 마지막에 .이 위치하면 제거
for(let i = 0; i < new_id.length; i++){
if (new_id[i] === '.' && (i === 0 || i === new_id.length-1)){
//None
}
else{
answer += new_id[i]
}
}
new_id = answer
answer = ''
//5단계 빈문자열 a대입
if (new_id === ''){
new_id = 'a'
}
answer = new_id
//6단계
if(answer.length > 15){
answer = answer.substring(0,15)
}
if(answer.)
//7단계
console.log(answer)
if(answer.length <= 2){
let pluschar = answer[answer.length-1]
for (let i = 0; i < 3- answer.length; i++){
answer += pluschar
}
}
return answer;
}
배열내의 다른 인덱스 값의 합으로 나올 수 있는 경우를
오름차순으로 반환해야 한다.
이중 for문을 통해 선형 순회로 해결해줬다
function solution(numbers) {
var answer = [];
for (let i = 0; i < numbers.length ;i++){
const num1 = numbers[i]
for (let j = 0; j < numbers.length ;j++){
if(i !== j){
const num2 = numbers[j]
const sum = num1 + num2
!answer.includes(sum) && answer.push(sum)
}
}
}
answer.sort(function(a, b) {
return a - b;
});
return answer;
}