티스토리 뷰





문제

 

효민이는 선린고를 졸업하고 CISCO에 입사하기 위하여 CISCO면접을 보았다.

효민이는 CISCO 면접 시험을 푸는 중이다.

네트워크에서 서브넷 마스크를 ex) 255.255.255.0 -> 11111111.11111111.11111111.0 -> /24(이진수에서 1의 개수가 24(8+8+8) 이런 식으로 줄여 표기하기도 하는데, 시험 문제에서는 255.255.255.0이 아닌

/24로 표기되어 있다고 한다.

효민이는 프로그래밍의 신이라 이 문제를 노트북을 키고 C언어로 쉽게 구현하려 한다.

만약 이 문제를 푼다면 효민이는 CISCO에 취직을 할 수 있다고 한다. 구현해보자.

 

 

입력

 

X를 입력 받는다. X0<=X<=32

 

출력

/X의 서브넷 마스크를 출력



입/출력 예시 1


입력1

 

24

 

출력1


입/출력 예시 2


입력2

 

30

 

출력2



코드

 

#include <stdio.h>

/* 

made by hyomin

   

*/ 

int twoConvertTen(int num);

int main(){

int x; //입력 

int a,b,c,d; //서브넷 마스크 a.b.c.d 

int binary=1;

int i = 0;

int ten;

a=0;

b=0;

c=0;

d=0;

scanf("%d", &x);

if(x>=8){//x가 8일시 11111111.0.0.0 이므로 255.0.0.0, 1<=x<8이라면 else문으로 들어감.   

a = 255;

if(x>=16){//x가 16일시 11111111.11111111.0.0 이므로 255.255.0.0, 8<x<16이라면 else문으로 들어감.

b=255;

if(x>=24){//x가 24일시 11111111.11111111.11111111.0 이므로 255.255.255.0, 16<x<24이라면 else문으로 들어감.

c=255;

if(x>=32){//x가 32일시 11111111.11111111.11111111.11111111 이므로 255.255.255.255, 24<x<32이라면 else문으로 들어감.

d=255;

}

else if(x != 24){

x = x-24;

for(i=1;i<x;i++){

binary = binary*10+1;

}

for(i=0;i<8-x;i++){

binary = binary *10;

}

ten = twoConvertTen(binary);

d = ten;

binary = 1;

}

}

else if(x != 16){

x = x-16;

for(i=1;i<x;i++){

binary = binary*10+1;

}

for(i=0;i<8-x;i++){

binary = binary *10;

}

ten = twoConvertTen(binary);

c = ten;

binary = 1;

}

}

else if(x != 8){

x = x-8;

for(i=1;i<x;i++){

binary = binary*10+1;

}

for(i=0;i<8-x;i++){

binary = binary *10;

}

ten = twoConvertTen(binary);

b = ten;

binary = 1;

}

}

else{// 바이너리 -> 십진수 

for(i=1;i<x;i++){

binary = binary*10+1; // 이 계산을 해주면 만약 x가 7이면 1111111이 됌. 

}

for(i=0;i<8-x;i++){

binary = binary *10; // 이 계산을 해주면  만약 x가 7이면 11111110이 됌. 

}

ten = twoConvertTen(binary); // 십진수 변환 함수 호출. 

a = ten;

binary = 1; //변수 값 초기화 

}

printf("%d.%d.%d.%d", a, b,c,d);//최종 출 력 

return 0;


int twoConvertTen(int num){//2진수 -> 10진수 변환 함수. 

int result = 0;

int mul = 1;

while(num>0){

if(num%2){

result += mul;

}

mul *= 2;

num /=10;

}

return result;

}


출제의도 


네트워크와 같은 많은 it분야에서 프로그래밍이 많이 쓰인다. 이 문제는 간단한 이진수->10진수 문제가 아니라 a.b.c.d 각 부분에 대하여 십진수 변환을 해줘야 하므로 머리가 아프다. 십진수 변환 알고리즘도 알아야 한다. 항상 프로그래밍 문제를 풀다보면 실용적인 면보다 수학적인 면이 더 높다. 이 문제는 실제로도 많이 쓰이는 곳인 네트워크라는 컨셉을 사용하여 컴퓨터 입문자들에게 흥미로운 프로그래밍을 할 수 있도록 도와준다.



Comments