[BOJ] 1259. 펠린드롬수 (C,Python3)
- 코딩 초보. 구현을 목표로 하였기에 비효율적일 수 있습니다.
1259. 펠린드롬수
어떤 단어를 뒤에서부터 읽어도 똑같다면 그 단어를 팰린드롬이라고 한다. 'radar', 'sees'는 팰린드롬이다.
수도 팰린드롬으로 취급할 수 있다. 수의 숫자들을 뒤에서부터 읽어도 같다면 그 수는 팰린드롬수다. 121, 12421 등은 팰린드롬수다. 123, 1231은 뒤에서부터 읽으면 다르므로 팰린드롬수가 아니다. 또한 10도 팰린드롬수가 아닌데, 앞에 무의미한 0이 올 수 있다면 010이 되어 팰린드롬수로 취급할 수도 있지만, 특별히 이번 문제에서는 무의미한 0이 앞에 올 수 없다고 하자.
입력은 여러 개의 테스트 케이스로 이루어져 있으며, 각 줄마다 1 이상 99999 이하의 정수가 주어진다. 입력의 마지막 줄에는 0이 주어지며, 이 줄은 문제에 포함되지 않는다.
각 줄마다 주어진 수가 팰린드롬수면 'yes', 아니면 'no'를 출력한다.
1.C99
#include <stdio.h>
#include <string.h>
main() {
char num[6];
int n,k;
while (1) {
scanf("%s", &num);
if (num[0]== '0') return 0;
n = strlen(num);
k = 0;
for (int i = 0; i <= n / 2 - 1; i++) {
if (num[i] != num[n - i - 1]) {
k++;
break;
}
}
if (k == 0) {
printf("yes\n");
}
else {
printf("no\n");
}
}
}
맞왜틀(맞는데 왜 틀리지) 고민을 많이 했다.. 그런데 반례는 금방 찾아냈다. 처음에는 한자리가 오면 무조건 yes를 출력하고 두자리수가 오면 no를 출력하도록 했는데..생각해보니 11이 오면 펠린드롬수에 해당하기 때문에 no를 출력하면 안된다. 그래서 처음에 했던 if 조건문을 삭제하고 for 반복문만 남겼다.
펠린드롬 수의 경우에는 숫자 길이/2 까지의 위치만 검사하면 된다. 만약에 4자리 수가 입력된다면 2번째 자리까지 (ex. 1221 의 경우 12만 검사하면 된다. 그러니 인덱스 상으로는 인덱스 1번까지 검사하면 되는것!) 따라서 for 반복문의 조건을 위와 같이 작성했다.
k라는 변수를 만들어주어서 수가 짝지어져서 같지 않게 되는 경우가 발생했을 경우 바로 k를 1 증가시키고 break한다. (더이상 검사할 필요가 없으니까!) 그리고 다음 if 조건문에서 k가 0이 아니므로 no를 출력하도록 한다.
(C) 구현하면서 헷갈렸던 점
0이 입력되면 while 루프를 빠져나오도록 하기 위해서 if 조건문을 작성했었던 부분에서, num[0] == 0 이 아니라 '0' 이라고 해야만 정상 종료된다. 아니면 0을 한자리 수 무언가로 인식해서 아래에 있는 코드들을 수행하게 된다.
2.Python
while(1):
num=list(input())
if (num[0]=='0'):
break
k=0
for i in range(0,int(len(num)/2)):
if(num[i]!=num[len(num)-i-1]):
k+=1
break
if(k==0):
print("yes")
else:
print("no")
같은 방식으로 구현하면 된다. 주의할 점은 for반복문에서 len(num)/2 를 int형으로 바꾸어줘야한다는 점.
'💻STUDY > BOJ' 카테고리의 다른 글
[BOJ] 2675. 문자열 반복 (C,Python3) (0) | 2022.01.17 |
---|---|
[BOJ] 8958. OX퀴즈 (C,Python3) (0) | 2022.01.17 |
[BOJ] 10809. 알파벳 찾기 (C,Python3) (0) | 2022.01.16 |
[BOJ] 3052. 나머지 (C,Python3) (0) | 2022.01.15 |
[BOJ] 2908. 상수 (C,Python3) (0) | 2022.01.15 |
댓글