기본적인 시간 계산 문제이다.

 

문제에서 요하는건

  입력값 출력값
1번 경우 17 40 0 14 33 20
200
2번 경우 17 40 45 19 21 0
6017
3번 경우 23 48 59 0 30 54
2515

 

다음과 같이 출력되는 것이며 조건은 다음과 같습니다

 

생각을 잠시해보면,, 

- 1시간을 초로 환산하면 1 X 60 X 60 = 3600초

- 1분을 초로 환산하면 60초 이기 때문에 이걸 응용해서 문제를 해결하면 될거같습니다.

 

우선 입력을 받기위해 scanf 로 입력을 받겠습니다

입력을 받아야할것은 총 두개로 시간 , 분 , 초 엔터(개행) 후에 요리시간에 걸리는 초입니다.

변수는 보기쉽게 hour , min , sec , time 으로 하였습니다.

#include <stdio.h>

int main(){
    int hour,min,sec; // 시간 , 분 ,초 변수
    int time; // 걸리는 초 변수
    scanf("%d %d %d",&hour,&min,&sec); // 시간,분,초 입력 받기
    scanf("%d",&time); // //걸리는 초 입력받기
}

이제 입력을 받았으면 초(time 변수) 를 시간, 분, 초로 변환해

각각 시간(hour 변수)  분(min 변수)  초(sec변수) 에 더해주도록 하겠습니다.

 

    hour = hour + time/3600;
    min = min + time%3600/60;
    sec = sec + time%3600%60;

위에서 이야기 한것처럼 1시간은 3600 초 이므로 받아온초(time 변수) 에서 3600으로 나눈 몫이 시간이되겠죠?

잡설인데.. 2023년 정보처리기사 실기 2회차 문제에 동전 거스름돈 문제가 나왔었습니다,, %%% 십

 

다 더해주었다면 이제 각각 다음과정을 거쳐야합니다.

 

1. 초가 60이 넘는다면 0부터 다시 시작하고 분에 넘는시간만큼 더해주기

2. 분이 60이 넘는다면 0부터 다시 시작하고 시간에 넘는시간만큼 더해주기

3. 시간이 24가 넘는다면 0부터 다시 시작하게

 

왜냐하면 26시간 88분 67초라는 시간은 이세상엔 없기 때문입니다,,

실제로 위과정까지 더해주기만 하면 이런값들이 보여지겠죠?

if(sec>=60) { //초가 60을 넘기게되면
        min = min + sec /60 ; // 초에서 나눈 몫을 분에 더해줍니다.
        sec = sec %60 ; // 나머지값을 남기면됩니다.
    } 
    if(min>=60) {
        hour = hour + min/60 ; // 초 계산과 동일합니다.
        min  =  min%60 ;
    }
    if(hour>=24){ 
        hour = hour % 24;
        // 여기서 -24가 아닌 나머지 연산자로 %24를 해야합니다. 반례로 98을 생각해보세요 -24를 하면
        // 결과는 74가 될것입니다,,
    }
    
    // 여기서 중요한게 시간,분,초 순으로 조건문을 걸게되면 문제가 생길수도있습니다
    // 예를 들어 134 + 149 계산을할때 일의 자리부터 계산을 해서 10을 초과하는건
    // 다음자리로 넘겨주잖아요? 이거랑 동일하게 생각하시면 됩니다.

 

아래엔 풀코드입니다.

#include <stdio.h>

int main(){
    int hour,min,sec;
    int time;
    scanf("%d %d %d",&hour,&min,&sec);
    scanf("%d",&time);
    hour = hour + time/3600;
    min = min + time%3600/60;
    sec = sec + time%3600%60;
    if(sec>=60) {
        min = min + sec /60 ;
        sec = sec %60 ;
    }
    if(min>=60) {
        hour = hour + min/60 ;
        min  =  min%60 ;
    }
    if(hour>=24){
        hour = hour % 24;
    }
    printf("%d %d %d",hour,min,sec);
}

 

좀 중구난방이였는데 도움이 되셨을까요,,

1264번: 모음의 개수 (acmicpc.net)

 

1264번: 모음의 개수

입력은 여러 개의 테스트 케이스로 이루어져 있으며, 각 줄마다 영어 대소문자, ',', '.', '!', '?', 공백으로 이루어진 문장이 주어진다. 각 줄은 최대 255글자로 이루어져 있다. 입력의 끝에는 한 줄

www.acmicpc.net

 

문제가 원하는 답은 

How are you today? 일때  7

Quite well, thank you, how about yourself 일때 14

I live at number twenty four 일때  9

종료

이렇게 짜면될거같습니다. 딱히 문장갯수 이야기가없어 제한없이 무한반복으로 받겠습니다..

문자열을 처리할때 띄어쓰기 포함은 %[^\n]s 로 입력받고

바로 밑단에 getchar() 를 이용해 개행키를 받아주기로 합시다,,,,, 하지 않으면 오류남

#include <stdio.h>
#include <string.h>

int main(){
	char a[255];
	int cnt =0;

	while(1){
    	scanf("%[^\n]s",a);
    	// getchar();
    	printf("%s",a);
}



}

이렇게 오류납니다,,

 

#include <stdio.h> 
#include <string.h> //---(1)

int main(){
char a[256]; //---(2)
int cnt =0; //---(3)

while(1){ // ---(4)
    scanf("%[^\n]s",a); //---(5)
    getchar(); //---(6)
    for(int i=0;i<strlen(a);i++){ //---(7)
        if(a[i]=='a'||a[i]=='i'||a[i]=='u'||a[i]=='e'||a[i]=='o'||a[i]=='A'||a[i]=='I'||a[i]=='U'||a[i]=='E'||a[i]=='O') 
        cnt++;
    }
    if(a[0]=='#'&&strlen(a)==1) break; //---(8)
   
    printf("%d\n",cnt);
    cnt =0; //---(9)
}



}

풀코드입니다 위에서 부터보면

(1) #include <string.h> (7),(8) 번에서 쓰이는 문자열 함수 strlen( )을 불러오기 위한 라이브러리입니다. 문자열 길이를 알수있습니다.

(2) 문제 조건에 보면

라고 하는데 c언어에서 문자열에 마지막은 \0 널값입니다, 그래서 문자열의 크기를 256으로 할당했습니다.

(3) 정수형 변수 cnt 는 0으로 초기화 해주었습니다

(4) 반복문은 문제의 조건에 문장이 몇개인지 명시되어있지않아 # 이 나오기 전까지 계속 무한 반복하기위해 while(1)

(5) 위에서 설명했던거 처럼 띄어쓰기도 문자로 받기위해 scanf("%[^\n]s",a) 라고 써주었습니다

(6) 엔터키(개행키)를 따로 받아주기위해 getchar( ) 함수를 이용했습니다 왠지(5)번에 [^\n]와 같이쓰니 오류가 나는거같았습니다.,,.,.

(7) 받아온 문자열 a를 반복문을통해 문자열길이만큼 반복해서 모음의 갯수를 파악합니다. 추가로(3)의 변수 cnt에 조건에 만족한다면 1씩 증가시킵니다.

(8) 문제의 조건이었던 #이 나오면 종료되게 하기위해 break문으로 while(1) 밖으로 나갈수있게해줍니다. 여기서 #hi와 같은 문장도 혹시나 테스트할때 들어갈까봐 깔끔하게 # 한글자만 나왔을때 종료되게 하게끔 조건을

if(a[0]=='#' && strlen(a)==1 ) break;  이렇게 걸었습니다.

(9) 하나의 문장테스트가 끝나면 cnt의 누적된 값이 다음 문장에 영향을 끼치지 않게하기위해 다시 0으로 초기화해주었습니다.

 

더 깔끔하게 쓰고싶습니다,, 화이팅,,

 

두개만 있으면 vs코드에서도 c언어를 컴파일 할수있습니다.

 

1. vs 코드 설치

 

Visual Studio Code - Code Editing. Redefined

 

Visual Studio Code - Code Editing. Redefined

Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications.  Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.

code.visualstudio.com

 


 

2.MinGW64 설치

 

https://sourceforge.net/projects/mingw-w64/files/mingw-w64/

 

MinGW-w64 - for 32 and 64 bit Windows - Browse /mingw-w64 at SourceForge.net

A platform built for a new way of working The Work OS that lets you shape workflows, your way

sourceforge.net

밑으로 내려서 x86_54-posix-seh 로 설치했습니다 

 

다운로드 후에 c드라이브에 압축풀기 해주시면 됩니다.

 

 


 

3. 환경변수 편집

win + r 키를 눌러 이동합니다. sysdm.cpl 입력

 

시스템 속성 - 고급 - 환경변수 

 

시스템 변수에서 path - 편집을 선택해줍시다.

새로만들기 후에 C:\mingw64\bin 방금 설치한 경로를 입력해주면 됩니다. 

 

만약 잘 모르시겠다면.

 

 

아까 압축푼 폴더로 이동하셔서 bin 이라는 폴더로 이동합니다

 

 

그다음 검색창을 왼쪽마우스로 클릭하면 경로가 나오는데 이걸 복사 붙여넣기 하시면됩니다.

이제 다 끄면 됩니다. ㅎㅎ


4. 확인 하기전에

4. 재부팅 꼭해주세요


 

5. 확인

 

명령 프롬프트를 열어줍니다.

 

gcc -v 를 입력해줍니다

다음과 같이 나오면 성공입니다.


 

6. vs코드 익스텐션 설치및 설정

 

vs코드를 실행한후 ctrl +x를하고 검색창에서 c/c++ 다음 익스텐션을 설치해주세요

추가로 아래 c/c++ extensions도 설치해주셔야 합니다

 

이제 폴더를 하나 만들고 열어준다음 다음과같이 생성했습니다

hello.c

#include <stdio.h>

int main(){

    printf("hello");

}

 

코드 작성후 오른쪽 상단에

실행 버튼 혹은 F6 키를 눌러줍니다

 

잘 나오는 모습입니다. .. 이제 이걸로 C언어 공부도 열심히 해야겠네요,,,

아 참고로 꼭 ctrl + s 저장후에 실행하셔야 오류가 안나고 실행됩니다. 기억해주세요

큰수 덧셈을 위해 필요한 정보를 차근차근 알아보았습니다.

앞서 말하면 int 자료형은 4byte 입니다

1byte 는 8bit이므로 4*8 = 총 32bit입니다

그러므로 2의 32승 만큼 표현이 가능합니다.

2의 32승은 =4,294,967,296 만큼 표현이 가능하다는 얘기입니다

이중 절반은 음수 절반은 양수이기 때문에

-2,147,483,647 ~ 2,147,483,647 값까지 표현할수있습니다.

그러면 long long int 형은 어떨까요?

자료형 long long int 는 8byte의 크기로

2의 64승 만큼의 크기를 나타낼수있습니다,,

그렇다면 크기를 초과하는 숫자는 ?

문자열 로 연산 수행을 해주어야합니다.

 

1. 세로열을 통한 덧셈으로 10이상이 넘어가면 해당배열의 값에서 10을 빼고 다음이나 이전배열에 +1

2. 계산하려는 숫자의 배열 역순으로 출력.

 

역순으로 출력해야하는 이유는 덧셈의 경우 다음과 같습니다.

15678,3456 임의의 두수를 덧셈을 하겠습니다.

일반적인 덧셈은 이런방식으로하죠?

하지만 배열은

이런식으로 저장되어있어 원하는 식으로 덧셈을 수행해 줄수가없습니다.

그렇다면 역순으로 배열의 내용을 바꾸어 준다면 어떨까요?

결과값을 다시 역순으로 출력해주면 

원하는 덧셈을 수행할수있겠죠?

한번 생각하고 그려본걸 코드로 구현해보겠습니다.

#include <string.h>// strlen 함수로 문자열 길이를 구하기 위해 가져왔습니다.
int main() {
	
	char arr1[6] = {1,5,6,7,8}; // 문자열은 꼭 +1 마지막에/0 값이 있어요
	char arr2[5] = {3,4,5,6}; // 마찬가지

	int len1 = strlen(arr1); // 위 배열의 길이 5; 
	int len2 = strlen(arr2); // 위 배열의 길이 4


	 // 여기는 이제 역순으로 출력할거에요  알아야할게 5번까지의 배열을 0-4,1-3 이런식으로 바꾸어서 4,3,2,1,0번 으로 바꿀수 있게 해줄거에요 
	for (int i = 0; i < len1/2; i++) {   // 가운데 조건을 1/2로 한 이유는 예를들어 len1이 5일경우 5/2는 2이므로 0부터 2까지 반복하죠?(아래로)
		int tmp = arr1[i];               // 변수 tmp에 값을 저장해주지 않으면 바꿀수없습니다.
		arr1[i] = arr1[len1 - i - 1];    // arr1[i] = arr1[len1 - i - 1] i가 0일때 arr1[0] = arr1[5-0-1] 즉 arr1[0]번값에 arr1[4]를 대입하라는 의미입니다.
		arr1[len1 - i - 1] = tmp;        // 그러면 여기는 arr1[4]에 위에 저장한 tmp=arr1[0] 값이니까 arr1[4]=arr1[0] 잘 바꿧씁니다.,,하하
	}
    
    
	//여기는 arr2의 역순 구하기
	for (int i = 0; i < len2 / 2; i++) {
		int tmp = arr2[i];
		arr2[i] = arr2[len2 - i - 1];
		arr2[len2 - i - 1] = tmp;
	}
    
    
	// 잘 되었는지 확인해볼게요
	for (int i = 0; i < len1; i++) {
		printf("%d ", arr1[i]);
	}
	printf("\n");
	for (int i = 0; i < len2; i++) {
		printf("%d ", arr2[i]);
	}
	
}

대 만족

다음엔 실제로 덧셈하는걸로 넘어가서 해볼게요!

출처:https://www.acmicpc.net/problem/10809

 

10809번: 알파벳 찾기

각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다. 만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출

www.acmicpc.net

 

흠.. 일단 보고 뭐지라는 생각을 제일 먼저 했습니다.

차근차근 읽어보니 요구하는것은

1. 문자열 입력 받기.

2. 입력받은 문자열이 나오는 순서대로 저장하기 (나오지 않은 알파벳은 -1로 처리)

apple를 예로 들겠습니다

ex) a(0)  p(1)  p(2중복생략)  l(3)   e(4)  

 0(a) -1(b) -1(c) -1(d) 4(e) -1(f) -1(g) -1(h) -1(i) -1(j) -1(k) 3(l) -1(m)

-1(n) -1(o) 1(p) -1(q) -1(r) -1(s) -1(t) -1(u) -1(v) -1(w) -1(x) -1(y) -1(z)

아 

0  -1  -1  -1  4  -1  -1  -1  -1  -1  -1  3  -1  -1  -1  1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1

결국 위에 값이 나오게 짜야합니다

오늘 아르바이트를 19시에갔는데 가기전에 계속 고민하고

가서도 계속 고민했습니다. (지금은 새벽 두시입니다,,)

어떤식으로 해야 구현할수있을지..

결국 필요한건 아래와 같다고 생각이들었습니다.

1. 문자열 입력받기

2. 비교할 알파벳 문자열(아스키코드)

3. -1과 1번에서 입력받은 문자열 순서 입력할 정수형 배열

4. 1번의 문자열에서 중복값제거하기

apple->ap0le 이런느낌으로요

코드를 짜보겠습니다..

#include<stdio.h>
#include<string.h> //strlen 함수 이용해서 입력받은 문자열 길이를 알아낼거에요

int main(){
//----------------------------------------------------------------------------------------//
    int arr[26]; //알파벳 소문자는 26글자니까 -1,-1,1,2,3... 형식으로 저장될 정수형 배열
    
    char alp[27] ={NULL}; //사실 {a,b,c....} 이런 식으로 초기화 해주어도 괜찮지만
    // 밑에 처럼 for문으로 깔끔하게 나타내고 싶었습니다..(더럽다면.. 죄송합니다)
    // 27인 이유는 문자열은 마지막에 널값이 있어서 꼭 하나 더 추가해주어야합니다 오류남
    
    char input[101]; // 최대 문장의 길이는 100이지만 위와 같은이유로 +1 해서 101
    
//----------------------------------------------------------------------------------------//    
    //배열 -1 대입하기//
    for (int i = 0; i < 26; i++) { // 정수형 배열에 없는 값은 -1로 표현하기로했으니
		arr[i] = -1;               // 26칸에 -1을 넣어줍니다.
	}
//----------------------------------------------------------------------------------------//    
    
    // 문자열에 알파벳 저장하기//
    for(int i=97;i<=122;i++){ // 아스키코드 97~122번은 a~z입니다
    alp[i-97]=i;    //i=97 일때 alp[0]=97, alp[1]=98.. 이런느낌으로 반복저장합니다. 
    		}
	
//----------------------------------------------------------------------------------------//
	
    //문자열 입력받기//
    scanf("%s",input); // 이건 쉽죠..?
    
//----------------------------------------------------------------------------------------//
    
    //*입력받은 문자열에서 중복값 제거 apple -> ap0le 이런느낌*//
    
    for (int i = 0; i < strlen(input); i++) {         
		for (int j = i+1; j < strlen(input); j++) { 
   // 두번째 for문에서 초기값을 i+1로 해두어서 비교할 문자열의 다음 문자부터 비교를해줍니다//
   // 이렇게 하지않으면 자기 자신도 비교하고 중복값으로 판단해 a00le 이렇게 나와요..//
			if (input[i] == input[j])  
				input[j] = '0'; 
		}
	}
	//printf("%s",input); -> ap0le 이렇게 출력됩니다//
    
//----------------------------------------------------------------------------------------//

    // 이제 정수형 배열에 값 저장하기//
    for (int i = 0; i < strlen(input); i++) { //중복값을 제거한 입력값을
		for (int j = 0; j < 26; j++) { // 하나하나 알파벳 전부랑 비교합니다
			if (input[i] == alp[j]) { // 만약 비교하는 값이 알파벳 순서대로 저장한 배열과 일치하면
				arr[j] = i; //알파벳 배열의 위치와 동일하게 정수형배열 arr에 저장해줍니다.
			}
		 }
        }
//----------------------------------------------------------------------------------------//
            for (int i = 0; i < 26; i++) {
            printf("%d ", arr[i]); //출력해주면 끝이에요... %d 뒤에 공백..신경쓰기
        }
    
}

사실 뭔가 분명 더 좋은 방법이 있었겠죠?

댓글로 남겨주시면 감사하겠습니다.

이제 예상한대로 나오는지 입력해볼게요..

apple      bobby    airplane     입력해보겠습니다.

아 기쁘다 해내니까

실수한 부분이나 이상한곳있으면 

지적 꼭 부탁드립니다!

감사합니다

일단 시간관련 함수를 사용하기 위해 time.h 라이브러리를 불러와줍니다

#include <stdio.h>

#include <time.h> //이곳입니다

int main(){


}

time.h 라이브러리에 있는 함수를 이용할것인데요

time_tlocaltime() 함수를 이용해야합니다

#include <stdio.h>
#include <time.h> 

int main(){

  	time_t t=time(NULL);
  	struct tm tm = *localtime(&t);

}

time_t 형태의 변수 t를 struct tm 구조체 값으로 변환하고localtime 함수는 구조체 포인터 값을 반환하기 떄문에struct tm tm =*localtime(&t)형태로 선언합니다.

struct tm {
   int tm_sec;   // 초
   int tm_min;   // 분        
   int tm_hour;  // 시      
   int tm_mday;  // 일        
   int tm_mon;   // 월        
   int tm_year;  // 년 ※1900년 부터의 년입니다.     
   int tm_wday;  // 요일    
   int tm_yday;  // 1년중 경과일 0~365     
   int tm_isdst; //      
};

struct 구조체의 내용은 다음과 같습니다 

예제 입력후에 결과값 받아보겠습니다

1. 년 월 일 시 분 초 입력받기

여기서 년은 +1900

월은 +1해야 현재 시간을 받아볼수있습니다.

이유는 년도는 1900년 이후 시간을 표시해주고

월은 구조체 안에 -1값으로 저장되어있기때문에

이점만 유의해서 출력하면됩니다!

#include<stdio.h>
#include<time.h>


int main() {
	time_t t = time(NULL);
	struct tm tm = *localtime(&t);

	printf("%d %d %d %d %d %d", tm.tm_year + 1900,   // 년도 1900년 이후 +1900
    	                          ,tm.tm_mon +1      // 월은 -1값 임으로 +1
                                  , tm.tm_mday       // 일
                                  , tm.tm_hour       // 시간
                                  , tm.tm_min        // 분
                                  , tm.tm_sec  );    // 초
	

}

코드는 가독성을 위해 이렇게 작성하였습니다

(이렇게 하면 오류납니다,,)

하하

2022년 11월 12일 15시 42분 44초 잘 출력되는걸 확인해볼수있습니다.

갑자기 든생각인데 시간을 AM PM형식으로 출력하려면 

어떤식으로해야할까요

#include<stdio.h>
#include<time.h>

int main() {
	time_t t = time(NULL);
	struct tm tm = *localtime(&t);

	char pm[3] = "PM"; // 오후
	char am[3] = "AM"; // 오전
	
	int n = 0;  //16시를 4시로 바꾸고 저장해줄 변수 n 선언
	if (13 <= tm.tm_hour && tm.tm_hour <= 23) { //13시 보다 크거나 23시보다 작을때 
		n= tm.tm_hour - 12;              //12를 빼주어야 1시~11시까지로 나타낼수있겠죠?
	}
	if (13 <= tm.tm_hour && tm.tm_hour <= 23) { // 오후는 13시부터 23시까지 잡았습니다
		printf("%s %d",pm,n); 
	}
	else {
		printf("%s %d",am,n); // 아니라면 오전으로 출력
	}

}

오후 4시라고 잘 나왔습니다.

(혹시 반례나 이상한게 있다면 얘기해주세요)

봐주셔서 감사합니다~!

사실 전역한지 얼마 안되어서 

16시 라고 이야기하는게 편하네요,,

끄적 끄적..

기존에 있는 배열의 값입력을 통해 받은 배열의 값

비교하고 중복되는 값을 저장하고 출력하는 문제입니다.

꽤 많은 시간이 들었던거같습니다... 이해가 안가면 끝까지 잡고있어야해서..

int main(){

                int arr_1[5]; // 기존에 주어질 값
                int arr_2[5]; // 입력받을값
                int arr_3[5]; // 비교하여 저장할곳

}

배열을 총 3개 각각과 같이 선언해주었습니다.

int main(){

         int arr_1[5]={1,2,3,4,5}; // 비교당하는 곳 초기화 (1)
         int arr_2[5]; 
         int arr_3[5]={0}; // 저장공간 초기화 (2)
 
			
            for(int i=0;i<5;i++){
            	scanf("%d",&arr_2);  //arr_2 배열에 값 입력받기(3) 
            }
}

제가 하고싶은건

다섯칸의 정수형 배열 arr_2[5]에 입력을 받고 

기존의 값 

int arr_1[5]={1,2,3,4,5}; 와 비교하는 것입니다.

따라서 (1)번과 같이 초기화(3)번과 같이 for문으로 arr_2번에 입력받아 저장했습니다

int main(){

         int arr_1[5]={1,2,3,4,5};
         int arr_2[5]; 
         int arr_3[5]={0}; 
			
            for(int i=0;i<5;i++){
            	scanf("%d",&arr_2);   
            }
            
            for(int i=0;i<5;i++){   // 비교하여 arr_3에 저장!
            	for(int j=0;j<5;j++){
                	if(arr_1[i]==arr_2[j]){
                    	arr_3[i]=arr_1[i];
                    }
                }
            }
            
}

여기가 핵심인데 그림으로 좀 그려보겠습니다

선언되어 있는 배열을 그림으로 나타냈습니다.

arr_2 값에는 임의로 5,6,7,8,9 라는 값을 넣어주었다고 임의로 가정했습니다.

죄송해요 더러워서

 for(int i=0;i<5;i++){
            
           for(int j=0;j<5;j++){
                
               if(arr_1[i]==arr_2[j])  {
                    
                        arr_3[i]=arr_1[i];
                   }

반복 비교부분만 때서 볼게요

첫번째 반복문의 i가 0 일때 두번째 반복문을 j=0부터 5까지 반복하겠죠?

이말을 다르게 하면 첫번째 배열의 i값의 해당하는 값두번째 배열의 모든 값

반복하여 비교해볼수있다는 얘기입니다 

이런 느낌으로요,,

그리고

 for(int i=0;i<5;i++){
            
           for(int j=0;j<5;j++){
                
               if(arr_1[i]==arr_2[j])  { // <- 여기로 일치하는지확인하고
                    
                        arr_3[i]=arr_1[i]; // <-여기로 arr_3번 배열에 중복값 저장시켜요
                   }

그러면 전부 해당 안되다가

arr_1[4]arr_2[0] 번 값이 5로 일치하죠?

그러면 일치할때 arr_3[ i ]값에 대입하라니까 다음과 같습니다

저장해요
그러면 arr_3[4]는 5에요.

int main(){

         int arr_1[5]={1,2,3,4,5};
         int arr_2[5]; 
         int arr_3[5]={0}; 
			
            for(int i=0;i<5;i++){
            	scanf("%d",&arr_2[i]); // 여기오타였어요 죄송합니다  ㅎㅎ 
            }
            
            for(int i=0;i<5;i++){   // 비교하여 arr_3에 저장!
            	for(int j=0;j<5;j++){
                	if(arr_1[i]==arr_2[j]){
                    	arr_3[i]=arr_1[i]; //  (1)
                    }
                }
            }
            
            for(int i=0;i<5;i++){ 
                 if(arr_3[i]!=0){ // 위에 (1)번에서 저장안된 애들은 0이겠죠?
                 	printf("%d\n",arr_3[i]); // 0 이 아니라면 출력한다. 그르면 중복된값을 출력하겠죠?
                 }
            }            
}

5,6,7,8,9 대입
1,2,5,6,9

붙잡고 씨름을 좀 했더니 어지럽네요,,

scanf를 통해 입력을 받을때 

문자나 문자열을 입력받으면 오류가 발생할때가 있습니다..

int main() {

	int a, b;
	
	scanf("%d", &a);
	scanf("%d", &b);
	
	printf("첫번째 의 값은 ==> %d", a);
	printf("두번째 의 값은 ==> %d", b);
	

}

이렇게 정수 두개만을 입력받을때는 문제가없습니다.

하지만 추가로 문자를 입력받으면 어떨까요?

 

int main() {

	int a, b;
	char c;

	scanf("%d", &a);
	scanf("%d", &b);
	scanf("%c", &c); //추가

	printf("첫번째 의 값은 ==> %d\n", a);
	printf("두번째 의 값은 ==> %d\n", b);
	printf("세번째 의 값은 ==> %c\n", c); //추가
	

}

놀랍게도 입력할 기회도 주지 않습니다.

문제는 함수를 통해 입력하고 엔터키를 칠때 이 엔터를 그냥 행위가 아닌 '\n'의 문자로 받아들이는 것에서 발생합니다.

버퍼에 남아있는 '\n'의 값을 초기화 해주기 위해선 getchar() 함수를 scanf 직전에 넣어주면됩니다

int main() {

	int a, b;
	char c;

	scanf("%d", &a);
	scanf("%d", &b);
	getchar(); //엔터값 제거
	scanf("%c", &c);

	printf("첫번째 의 값은 ==> %d\n", a);
	printf("두번째 의 값은 ==> %d\n", b);
	printf("세번째 의 값은 ==> %c\n", c);
	

}

성공적으로 입력,출력 했습니다!

+ Recent posts