본문 바로가기
Algorithm

[Algorithm] Swift 백준 1259번

by ykr0919 2024. 3. 9.

 

 

https://www.acmicpc.net/problem/1259

 

1259번: 팰린드롬수

입력은 여러 개의 테스트 케이스로 이루어져 있으며, 각 줄마다 1 이상 99999 이하의 정수가 주어진다. 입력의 마지막 줄에는 0이 주어지며, 이 줄은 문제에 포함되지 않는다.

www.acmicpc.net

 

문제접근 

 

이번 문제 난이도가 높지 않다고 생각이 들었다. 그냥 문제를 읽고 조건만 천천히 넣어주었다.

 

 

정답풀이

 

import Foundation

var inputArr: [String] = []
var reversedArr: [String] = []

while true {
    let n = readLine()!
        if n == "0" {
            break
        }
        inputArr.append(n)
    
}

for i in 0..<inputArr.count {
    
    let reverse = String(inputArr[i].reversed())
    reversedArr.append(reverse)
    
    if inputArr[i] == reverse {
        print("Yes")
    } else {
        print("No")
    }
}

 

 

우선 입력값을 넣어줄 배열과 입력값을 거꾸로 변경하여 넣어줄 배열을 생성하였다.

 

문제 조건을 보면 입력의 마지막 줄에 0이 주어지면 문제가 끝나기 때문에, 

 

while문을 이용해서 0을 입력받게 되면 종료가 되도록 하였다.

 

for문을 이용해서 입력받은 수만큼 반복을 하고 있고 입력값과 입력을 거꾸로 한 값을 비교한다.

 

비교 후 같으면 ''Yes"을 입력하고 다르면 "No"를 입력한다.

 

 

 

 

예시 입력을 넣어보니깐 잘 나온다!! 

 

자 ~ 그럼 백준에 제출을 해보자!!

 

 

근데 엥??? 왜 틀렸음??? 🤔

 

뭐지... 예시 입력은 잘 넣었잖아....   혼란이 살짝 왔다..

 

고민을 좀 하고도 찾기가 힘들어 조언을 구하니..

 

Yes, No가 잘못이 됐단다... 헐..

 

진짜 어이가 없었다 ㅋㅋㅋㅋ 

 

 

문제를 다시 보니깐 Yes, No 가 아니라 yes, no로 출력이 돼야 한다!!

 

그래도 설마 그 정도는 상관없지 않을까라고 생각했는데!~ 

 

정답코드

 

import Foundation

var inputArr: [String] = []
var reversedArr: [String] = []

while true {
    let n = readLine()!
        if n == "0" {
            break
        }
        inputArr.append(n)
    
}

for i in 0..<inputArr.count {
    
    let reverse = String(inputArr[i].reversed())
    reversedArr.append(reverse)
    
    if inputArr[i] == reverse {
        print("yes")
    } else {
        print("no")
    }
}

 

 

 

맞았네.. ㅎㅎ 

 

출력이 문자열일 때 주의해야 하는 게 

 

이런 실수를 올림피아드 챔피언들도 종종 하는 실수라고 한다!!  또 알고리즘 책에도 주의하라고 적혀있다고..

 

친절히 알려주셨다!! 

 

꼭 ~ 다음 실수는 없도록 해야겠다!! 

 

 

그리고 한 가지를 더 알려주셨는데 

 

배열 첫 인덱스랑 마지막 인덱스를 동시에 줄여나가면서 일치하지 않는 경우에 바로 no 출력하고 멈춰버릴 수도 있다~  

 

그럼 배열 하나로 끝낼 수 있어서 시간복잡도를 잡을 수 있다고.. 

 

 

이 조언을 바탕으로 다시 문제를 풀어보는데 (완전 흡수해서 똑같은 방법으로는 해결 못함) 느낌으로는 비슷한 접근?? 일까..  

 

 

그때!!! 

갑자기 든 생각이 잠만!! 굳이 배열이 필요 없을 거 같은데! 🤷‍♂️ 

 

그냥 값 받아온 거 바로 거꾸로 만들어서 비교하고 출력하면 되는 거 아니야??? 🤷‍♂️

 

while true {
    let n = readLine()!
    
    if n == "0" {
        break
    }
    
    if n != String(n.reversed()) {
        print("no")
    } else {
        print("yes")
    }
}

 

이렇게 변경해 보았다!! 

 

 

결과는 맞았고!! 위에가 방금 푼 결과인데 코드 길이가 줄면서 시간도 거의 2배 가까이 줄었다!! 

 

또 이번에 문제를 풀면서 알게 된 건데,

 

문제의 예제 입출력처럼 입력이 다 끝나고 출력이 돼야지 답으로 인정해 줄지 알았는데, 

 

입력 -> 출력 -> 입력 -> 출력 순서라도 문제가 되지 않아 보였다!! 

 

 

 

 

어려운 문제는 아니었지만 생각지도 못한 실수로 틀린 게 아까웠다!! 

더 이상 문자열 실수는 인생에서 없다! ㅋㅋ 

 

그리고 이번 문제는 틀린 이유에 대해서 조언을 구했지만 

 

다시 문제를 보면서 다른 방향으로도 문제를 볼 수 있게 된 거 같다!! 

 

역시 잘하는 사람은 생각이 달랐다!! 

 

 

나도 누군가에게 조언해 줄 수 있게 파이팅!! 👊🏻