티스토리 뷰
문제
예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.
크로아티아 알파벳 | 변경 |
---|---|
č | c= |
ć | c- |
dž | dz= |
đ | d- |
lj | lj |
nj | nj |
š | s= |
ž | z= |
예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.
dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.
입력
첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다.
단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.
출력
입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.
예제 입력 1
ljes=njak
예제 출력 1
6
예제 입력 2
ddz=z=
예제 출력 2
3
예제 입력 3
nljj
예제 출력 3
3
예제 입력 4
c=c=
예제 출력 4
2
해설
이 문제의 채점에는 오류가 있다.
내가 문제를 잘못 이해한 것이 아니라면 제시된 표에 해당하는 변경된 문자 c=, c-, dz=, d-, lj, nj, s=, z=
만 하나의 문자로 세야 한다. 그래서 소스코드과 같이 코드를 작성했고 테스트 입력에 정확한 출력을 얻었다. 그래서 BOJ의 채점을 받았는데 결과는 틀렸습니다였다. 왜일까? 코드를 꼼꼼히 다시 읽어 봐도 어디가 틀렸는지 찾을 수 없다. 예제 출력 외 에러를 발생할 만한 입력을 넣어 보아도 문제를 발견하기는 어려웠다.
결국 다른 사람의 코드를 찾아보았다. 내 접근방식과 거의 동일한 방식의 코드(아래의 정답 코드
)를 발견하고 그 코드로 채점을 받아 보았다. 그런데 놀랍게도 채점 결과는 맞았습니다!였다. 무슨 차이가 있었던 걸까? 다시 두 코드를 비교해 보았더니 아래와 같은 차이를 발견했다.
-
내 코드
} else if (input_str[i] == 'c' || input_str[i] == 's' || input_str[i] == 'z') { if (input_str[i + 1] == '=') continue; } else if (input_str[i] == 'c' || input_str[i] == 'd') { if (input_str[i + 1] == '-') continue;
-
정답 코드
else if (lett == 'c' || lett == 's' || lett == 'z') { if (word[i + 1] == '=' || word[i + 1] == '-') continue; }
내 코드는 c-
만을 하나의 문자로 세도록 처리되었다. 그런데 정답 코드는 문제의 표에 제시되어 있지 않은 s-, z-
까지 하나의 문자로 세도록 처리되어 있는 것이다. 실제 정답 코드를 실행해서 as-
를 입력하면 2
라는 출력을 얻는다.
분명 문제에서는 제시된 문자들만 예외로 처리하는 것이라면 내 코드와 같이 처리되어야 한다. 그럼에도 내 코드는 틀린 코드로, 표에 제시되지 않은 문자들까지 하나의 문자로 세도록 한 코드는 옳은 코드로 채점되고 있었다.
좀 짜증나는 일이다.
소스코드: C
#include <stdio.h>
int main(int argc, char *argv[])
{
char input_str[101];
int i, count = 0;
scanf("%s", input_str);
for (i = 0; input_str[i] != '\0'; ++i) {
if (input_str[i] == 'n' || input_str[i] == 'l') {
if (input_str[i + 1] == 'j')
continue;
} else if (input_str[i] == 'c' || input_str[i] == 's' || input_str[i] == 'z') {
if (input_str[i + 1] == '=')
continue;
} else if (input_str[i] == 'c' || input_str[i] == 'd') {
if (input_str[i + 1] == '-')
continue;
} else if (input_str[i] == 'd'){
if (input_str[i + 1] == 'z' && input_str[i + 2] == '=')
continue;
}
count++;
}
printf("%d\n", count);
return 0;
}
정답 코드?
#include <stdio.h>
int main() {
char word\[101\];
scanf("%s", word);
int i;
int cnt = 0;
for (i = 0;; i++) {
char lett = word[i];
if (word[i] == NULL)
break;
if (lett == 'n' || lett == 'l') {
if (word[i + 1] == 'j') continue;
}
else if (lett == 'c' || lett == 's' || lett == 'z') {
if (word[i + 1] == '=' || word[i + 1] == '-') continue;
}
else if (lett == 'd') {
if (word[i + 1] == '-') continue;
if (word[i + 1] == 'z' && word[i + 2] == '=') continue;
}
cnt++;
}
printf("%d", cnt);
}
'Python > 심사문제' 카테고리의 다른 글
백준(BAEKJOON): 손익분기점(1712번) (0) | 2020.03.28 |
---|---|
백준(BAEKJOON): 그룹 단어 체커(1316번) (0) | 2020.03.28 |
백준(BAEKJOON): 상수(2908번) (0) | 2020.03.28 |
백준(BAEKJOON): 다이얼(5622번) (0) | 2020.03.28 |
백준(BAEKJOON): 단어의 개수(1152번) (0) | 2020.03.26 |
- Total
- Today
- Yesterday
- 리찬규
- books
- word
- PyQt5
- tips
- BOJ
- Python
- QtDesigner
- setText()
- baekjoon
- QComboBox
- Mac
- 소수
- QLabel
- django
- QLineEdit
- NK
- 유래
- judge
- 어원
- python3
- 리규찬
- words
- Tistory
- QGridLayout
- 북한말
- C
- MacOS
- 백준
- locallibrary
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |