Algorithm Problem Solving/Programmers

[프로그래머스] 서울에서 김서방 찾기, 소수 찾기, 시저 암호

코코자장자장 2021. 12. 7. 14:38

안녕하세요! 오늘은 서울에서 김서방 찾기,  소수 찾기, 시저 암호 문제를 풀어보았습니다!

 

 

 

 

요즘 문자열 문제를 너무 많이 풀어 문자열 달인이 될까 두렵습니다... 하핳...

 

이제 같이 문제를 풀어보시죠!

 

 

1. 서울에서 김서방 찾기

 

서울이라는 문자열배열에서 Kim과 같은 문자열을 찾고 출력해주는 것이다.

 

for - in 구문으로 count 를 통해서 배열을 탐색합니다

 

그후 Kim과 문자열을 비교해서 문자열과 동일할 시 결과를 저장하고 for문을 break로 탈출하면 문제가 해결 됩니다!

 

func solution(_ seoul:[String]) -> String {
    var count = seoul.count
    var result = "김서방은 "
    for i in 0..<count  {
        if seoul[i] == "Kim" {
            result += String(i)+"에 있다"
            break
        }
    }
    return result
}

 

2. 소수 찾기

 

이와 비슷한 문제를 많이 풀어보았는데요.

 

소수찾기는 역시 에라토스테네스의 체로 거르면서 하는게 제일 빠른듯합니다!

 

DP(dynamic programming)의 가장 쉬운 문제라고 할 수 있네요!

 

결과를 찾고 그 결과를 다음 번에 이용해서 더 빠르게 결과를 얻어내는 알고리즘입니다.

 

소수인지 아닌지 판단하는 방법은 약수가 1과 자신만 존재해야하기때문에 소수의 배수를 다 지우면서 문제를 풀어나가면 됩니다!

 

우선 소수배열을 repeating count 를 이용해 n+1(0번배열 안사용해용)까지 만들어줍니다.

 

그 후 2부터 n까지 검사하면서 소수라면 소수의 배열에 자신의 배수를 다 제외시킵니다.

 

이런 방식으로 n까지 검사한다면 %연산 한번없이 소수를 빠르게 탐색 가능합니다.

 

func solution(_ n:Int) -> Int {
    var result = 0
    var primeNumber: [Int] = [Int](repeating: 0, count: n+1)
    
    for i in 2...n{
        if primeNumber[i] == 0 {
            result += 1
            for j in 1...n/i {
                primeNumber[i * j] = 1
            }
        }
    }
    return result
}

 

 

3. 시저 암호

 

시저 암호 문제는 아스키 코드란 것을 알고 있다면 쉽게 푸실 수 있는 문제입니다.

 

출처 : 위키미디어(https://commons.wikimedia.org/wiki/File:Danycopyan.png)

우선 문자열을 각각 ascii code로 치환합니다.

 

치환 후 소문자와 대문자를 구분하여 

if ascii >= 97 { // 소문자
    ascii = (((ascii - 97) + n) % 26) + 97
}
else{
    ascii = (((ascii - 65) + n) % 26) + 65
}

위와 같은 방식으로 n만큼 shift시킬 수 있습니다!

 

이렇게 shift시켜준 후 return 해주면 문제가 해결됩니다!

func getStringByIndex(_ s:String, _ n:Int) -> String {
    return String(s[s.index(s.startIndex, offsetBy: n)])
}

func solution(_ s:String, _ n:Int) -> String {
    
    var result = ""
    for i in 0..<s.count {
        if getStringByIndex(s, i) == " " {
            result += getStringByIndex(s, i)
        }
        else {
            let a = getStringByIndex(s, i).unicodeScalars
            let num = UnicodeScalar(Int(a[a.startIndex].value))
            var ascii = Int(a[a.startIndex].value)
            
            
            if ascii >= 97 { // 소문자
                ascii = (((ascii - 97) + n) % 26) + 97
            }
            else{
                ascii = (((ascii - 65) + n) % 26) + 65
            }
            let ss = UnicodeScalar(ascii)!
            result += String(ss)
        }
    }
    
    return result
}

 

 

 

오늘은 여기까지 입니다.

 

봐주셔서 감사하고 좋은 하루 되세요!