10일차 알고리즘 (08.10)

태권·2022년 8월 10일
0

알고리즘

목록 보기
5/8

문제 1

시저 암호

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.

let lower = ['a', 'b', 'c', 'd', 'e', 'f','g', 'h', 'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r','s','t', 'u', 'v', 'w', 'x','y', 'z']
  
let upper = ['A', 'B', 'C', 'D', 'E', 'F','G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O', 'P', 'Q', 'R','S', 'T', 'U', 'V', 'W', 'X','Y', 'Z']
console.log(solution('A b',2))
function solution(s, n) {
    let sper = s.split('')
    for(let i=0; i<sper.length; i++){
        if(upper.indexOf(sper[i])>=0){
            let ind = upper.indexOf(sper[i])+n
            sper[i] = ind >= upper.length ? upper[ ind -upper.length] : upper[ind] 
        }else if(sper[i] == " "){sper[i] = " "}
        else{ 
            let ind = lower.indexOf(sper[i])+n
            sper[i] = ind >= lower.length ? lower[ind - lower.length] : lower[ind]
        }  
    }let answer = sper.join('')

    return answer;
}

일단 문자열을 나누고 띄어쓰기까지 구현 하니까 ''로 split 해줘서 배열을 만들고
그 배열의 첫 요소가 대문자에 포함되면 그 대문자의 index에 n을 더한 대문자로 바꾸어준다
배열이 띄어쓰기면 그대로 띄어쓰기로 해주고
배열의 i번째가 소문자면 소문자 배열의 index를 구해 n을 더한값을 반환해주고 나중에 합치면 끝

문제 2

크레인 인형 뽑기

function solution(board, moves) {

    var count =0;
    var stack = [];

    for(var i=0;i<moves.length;i++){
        var now = moves[i]-1
        for(var j=0;j<board.length;j++){
            if(board[j][now]!=0){
                if(stack[stack.length-1]===board[j][now]){
                    stack.pop();
                    count+=2;
                }
                else{
                    stack.push(board[j][now])
                }
                board[j][now] = 0;
                break;
            }
        }
    }
    console.log(stack)
    return count
}

무브의 숫자가 1이면 [1][i]를 돌려서 =! 0일때 그값을 문자열에 담고 [1][i]는 0으로 바꿈 만약 [1][i]의 마지막이
0이라면 false => 0은 다 무시하기로 중간에 바꿈
이걸 계속 반복하고
빼온 문자열이 지금 까지 빼논 글자 마지막과문자가 같으면 집어넣지 않고 마지막 글자도 지우고 cout 2개를 올려줌
만약 마지막 글자와 다르면 넣어줌 끝
위에꺼 되기 전

function solution(board, moves) {
    let list = []
    let answer = []
    for(let i=0; i<moves.length; i++){
        let ind = moves[i]-1
        for(let j=0; j<board.length; j++){
            if(board[j][ind] == 0){false;}
            else if(board[j][ind] !== 0){
                if(list[list.length-1] != board[j][ind]){
                    list += board[j][ind]
                board[j][ind] = 0
                break;
                }else{
                    answer += board[j][ind]
                    list.pop()
                    board[j][ind] = 0
                    break;
                }
                
            }
                
        }
    }
    console.log(board)
    console.log(list)//43113204
    
    
    return answer
}

if문 안에 if문 쓰는게 잘 못하겟고 break 를 어디에 둘지도 잘 몰랐었다.

function solution(board, moves) {
    let list = []
    let answer = []
    for(let i=0; i<moves.length; i++){
        let ind = moves[i]-1
        for(let j=0; j<board.length; j++){
            if(board[j][ind] !== 0){
                if(list[list.length-1] == board[j][ind]){
                    answer.push(board[j][ind]) 
                    answer.push(list[list.length-1])
                    list.pop();
                }else{
                    list.push(board[j][ind])
                    
                    
                }
                board[j][ind] = 0
                    break;
            }
                
        }
    }
    console.log(board)
    console.log(list)//43113204
    
    
    return answer
}

처음에 요 아래서 막혔다

function solution(board, moves) {
    let list = ""
    for(let i=0; i<moves.length; i++){
        let ind = moves[i]-1
        for(let j=0; j<board.length; j++){
            if(board[j][ind] == 0){false;}
            else if(board[j][ind] !== 0){
                list += board[j][ind]
                board[j][ind] = 0
                break;
            }
                
        }4362
    }
    console.log(board)
    console.log(list)//43113204
    
    
    return 
}

크레인에서 moves에 담긴 대로 값을 가져와서
인형이 쌓이는 통까지는 금방 만들었다
4311324 이런 식으로 인형이 쌓였을 때
중복되는 숫자 2개를 없애고 그다음 중복 숫자를 없애는 방법을 몇시간 동안 찾아봤지만 몇번을 반복할지 조건을 설정 할수가 없어서 처음부터 숫자를 뽑을 때 그때 이미 있는거랑 같으면 그숫자를 따로 빼기로 생각을 바꾸었다.
이 생각을 바꾸고 과정을 생각하는것을 어렵지 않았다
하지만 계속 어딘가에서 숫자가 생략되고 undefined가 뜨고 해서 스트레스를 받았다.

결국 모든 값을 list에 넣을려고 할때 list의 마지막값과 구해진 값이 같다면 answer에 넣고 다르면 다시 list에 넣어줘야하는데 이때 list의 마지막값도 같이 빼워야하는데 안빼줘서 계속 값이 틀리게 나왔었다. pop을 써서 마지막 값을 빼주니 모든게 해결이 되었다.

profile
2022.08 개발자 시작

0개의 댓글