백준 웹사이트 "2908번 - 상수" 문제풀이입니다.
언어는 C언어입니다. (제출 언어: C99)
문제
소스 코드
#include <stdio.h>
int main(void){
char input[7];
scanf("%[^\n]s", input);
for(int i=0; i<3; i++){
// i==0: left=2, right=6
// i==1: left=1, right=5
// i==2: left=0, right=4
int left = 2-i;
int right = 6-i;
if(input[left] > input[right]){
//print left
for(int l=0; l<3; l++){
printf("%c", input[2-l]);
}
break;
}
else if(input[left] < input[right]){
//print right
for(int r=0; r<3; r++){
printf("%c", input[6-r]);
}
break;
}
else{
continue;
}
}
}
문제 풀이
이전 문제인 1152번에서와 같이, scanf("%[^\n]s", input);
을 이용하여 공백까지 입력받습니다. '스캔셋'에 관한 자세한 설명은 1152번 문제풀이를 참고해주세요!
아래는 백준 웹사이트 "1152번 - 단어의 개수" 문제풀이입니다.
문제의 조건에 의해, 두 수 A, B는 항상 세 자리수이며, 0을 포함하지 않습니다. 따라서 입력 문자열은 두 수 사이의 공백까지 포함하여 항상 7 자리입니다. Line 7의 for문은 이 점을 이용하여, 백의 자리/십의 자리/일의 자리를 각각 비교합니다.
Line 13과 20을 보면, 각각 input[left] > input[right]
과 input[left] < input[right]
을 통해 두 수 A, B의 대소관계를 비교합니다. 이때 'input'은 크기 7의 char 배열이므로 위와 같이 대소관계를 비교하면 char 간의 비교가 됩니다. 예를 들어 '3'과 '4'를 비교할 때, 숫자 3과 숫자 4 간의 비교가 아니고, 문자 "3"과 문자 "4" 간의 비교가 되는 셈이죠. 이렇듯 숫자간의 비교가 아닌, 문자간의 비교를 해도 되는 것일까요? 제가 잘못된 소스 코드를 올리지는 않았을테니 아마 되겠죠. 이런식으로 대소관계를 비교해도 되는 이유는, char형의 숫자는 아스키 코드에 의해 정수형으로 바뀌어도 그 대소관계가 변하지 않기 때문입니다. 아스키 코드로 "0"은 48, "1"은 49, ... , "9"는 57입니다. 따라서 위의 예시대로 "3"과 "4"를 비교하면 아스키 코드로 변환되어 51과 52를 비교하게 되고, '51 < 52'는 '3 < 4'와 같은 결과를 내게 됩니다.
'코딩 > 백준 BOJ' 카테고리의 다른 글
[백준/C언어] 2941번 - 크로아티아 알파벳 (0) | 2022.01.12 |
---|---|
[백준/C언어] 5622번 - 다이얼 (0) | 2022.01.12 |
[백준/C언어] 1152번 - 단어의 개수 (0) | 2022.01.11 |
[백준/C언어] 1157번 - 단어 공부 (0) | 2022.01.10 |
[백준/C언어] 2675번 - 문자열 반복 (0) | 2022.01.09 |