[파일 열기와 닫기]

FILE *fp = fopen("input.txt""r");    // 파일 포인터 선언과 열기
fclose(fp);                            // 파일 닫기
cs




[파일 열기 방식]

 플래그

역할 

파일이 존재하지 않는 경우 

파일이 존재하는 경우 

파일 쓰기 시도할 경우 

 r

 읽기 모드

NULL을 반환 

존재하는 파일을 엶 

안 됨 

 r+

 읽기/쓰기

NULL을 반환 

존재하는 파일을 엶 

내용과 관계없이 겹쳐서 처음부터 써짐 

 쓰기

새로운 파일 생성 

새로운 파일 생성 

잘 써짐 

 w+

쓰기/읽기 

새로운 파일 새성 

새로운 파일 생성 

잘 써짐 

 a

쓰기(추가작성) 

새로운 파일 생성 

존재하는 파일을 엶 

뒤쪽에 추가로 써짐 

a+ 

쓰기/읽기 

새로운 파일 생성 

존재하는 파일을 엶 

뒤쪽에 추가로 써짐 

rb 

2진 읽기 모드 

NULL을 반환

존재하는 파일을 엶 

안 됨 

r+b 

2진 읽기/쓰기 

 NULL을 반환

존재하는 파일을 엶 

내용과 관계없이 겹쳐서 처음부터 써짐 

 wb

2진 쓰기 

새로운 파일 생성 

새로운 파일 생성 

잘 써짐 

 w+b

2진 쓰기/읽기 

 새로운 파일 생성

새로운 파일 생성 

잘 써짐 

ab 

 2진 쓰기(추가)

 새로운 파일 생성

존재하는 파일을 엶 

뒤쪽에 추가로 써짐 

 a+b

 2진 쓰기/읽기

새로운 파일 생성 

존재하는 파일을 엶 

뒤쪽에 추가로 써짐 



[fscanf, fprintf]

int x;
 
fscanf(fp, "%d"&x);
 
fprintf(fp, "%d", x);
cs

scanf, printf와 같이 사용하면 되는데, file pointer를 앞부분에 파라미터로 전달해준다.




[fgets, fputs]

char buf[BUF_SIZE];
 
fgets(buf, 30, fp);
 
fputs("Hello World", fp);
cs

- string 단위로 입출력을 실행하는 기능이다.

- fgets(char 배열, 읽을 크기, 파일 포인터)

- fputs(문자열, 파일 포인터)




[fseek]

fseek(fp, offset, FLAG);

cs


- 파일 포인터의 위치를 변경할 수 있다.

- FLAG로 다음을 사용할 수 있다.

  (1) SEEK_SET : 파일 처음

  (2) SEEK_CUR : 현재 위치

  (3) SEEK_END : 파일의 끝



[fwrite, fread - 바이너리 파일로 열었을 경우 사용 가능]

size_t fwrite(const void *buffer, size_t size, size_t count, FILE *stream);
cs


- 반환 : 파일에 쓴 데이터 항목의 수(count)



size_t fread (void *buffer, size_t size, size_t count, FILE *stream);
cs


- 반환 : 파일에서 읽어온 데이터 항목의 수(count)



'C & C++ > Reference' 카테고리의 다른 글

정렬 알고리즘  (0) 2018.05.02
C++ string 정리  (3) 2018.01.23


<실패했던 접근 방법 - 1>

1. 예제에서 10의 경우 2로 나누어떨어지지만, 10을 2로 나눠서 진행하는 것보다 10에서 1을 빼서 3으로 나누는 방법이 연산 횟수가 더 적다.

2. 2로 나누어떨어지더라도 1을 뺐을 때 3으로 나누어 떨어지면 그렇게 진행하는 것이 더 횟수가 적다고 판단

3. 메인 함수에서 조건문을 통해 다음과 같은 방식으로 알고리즘을 구현


<실패했던 알고리즘 - 1>

1. 조건문을 통해 2를 반복

2-1. 숫자가 3으로 나누어 떨어지면, 3으로 나누고 연산 횟수를 1 만큼 증가하고 2-5로 넘어간다. 그렇지 않으면 2-2로 넘어간다.

2-2. 숫자를 1 만큼 뺐을 때 3으로 나누어 떨어지면, 1을 빼고 3으로 나눈 후 연산 횟수를 2 만큼 증가하고 2-5로 넘어간다. 그렇지 않으면 2-3으로 넘어간다.

2-3. 숫자가 2로 나누어 떨어지면, 2로 나누고 연산 횟수를 1 만큼 증가하고 2-5로 넘어간다. 그렇지 않으면 2-2로 넘어간다.

2-4. 숫자를 1 만큼 빼고 연산 횟수를 1 만큼 증가한다. 2-5로 넘어간다.

2-5. 현재 숫자가 1이면 종료하고, 아니면 2-1부터 다시 반복 진행


<실패 이유>

 주어지는 입력 값이 작을 경우는 잘 동작하지만 숫자가 커지면 되지 않는 경우가 발생

 숫자가 커질 경우 위의 조건대로 하는 것보다 더 작은 경우가 있다는 것이기 때문에 어떠한 경우인지를 고민해봄




<실패했던 접근 방법 - 2>

1. 주어진 숫자로 1까지 만들어보는 연산을 다양하게 시도해본다.

2. 시도했던 방법들 중 연산 횟수가 가장 적은 것을 정답으로 출력한다.


<실패 이유>

 사실 실패했다기보다는 구현을 하다가 중단했다. 입력 숫자가 1000000까지도 주어질 수 있는데 이 방법으로 프로그램을 짜면 좋지 않은 코드가 될 것 같았다.



<접근 방법>

1. 특정 수가 주어졌을 때, 연산을 1회 거친 다음의 최소 횟수는 해당 수가 주어졌을 때의 최소 연산 횟수를 구하는 것과 같다.

2. 1~10까지를 위의 방법으로 최소 횟수를 정리해보면 다음과 같다.

 [1] - 0번

 1. 1


 [2] - 1번

 1. 2 -> 1 (연산 2)

 2. 2 -> 1 (연산 3)


 [3] - 1번

 1. 3 -> 1 (연산 1)


 [4] - 2번

 1. 4 -> 2 -> 1 (연산 2, 연산 2) 

 2. 4 -> 2 -> 1 (연산 2, 연산 3)  

 3. 4 -> 3 -> 1 (연산 3, 연산 1)


 [5] - 3번

 1. 5 -> [4] (연산 3, 2번)


 [6] - 2번

 1. 6 -> [3] (연산2, 1번) 

 2. 6 -> [2] (연산1, 1번)


 [7] - 3번

 1. 7 -> [6] (연산3, 2번)


 [8] - 3번

 1. 8 -> [4] (연산2, 2번)


 [9] - 2번

 1. 9 -> [3] (연산1, 1번)


 [10] - 3번

 1. 10 -> [9] (연산3, 2번)


3. 입력 숫자가 1~3인 경우는 미리 입력해준다.

4. 입력 숫자가 4 이상인 경우 4부터 주어진 입력 숫자까지 최소 연산 횟수를 구해나간다.

5. 특정 수의 최소 횟수를 구하기 위해서는 연산 1~3이 가능한지를 체크해보고 가능한 연산을 진행한 후, 가장 최소값을 최소 연산 횟수로 판단한다.




<위의 방법으로 성공한 코드는 다음과 같다>

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
31
32
33
34
35
36
37
38
39
#include <iostream>
 
using namespace std;
 
int checkMinPath(int *cnt, int N) {
    int min = 1000000;
    int temp;
 
    if(N%3 == 0) {
        temp = cnt[N/3+ 1;
        min = temp;
    }
    if(N%2 == 0) {
        temp = cnt[N/2+ 1;
        if(temp < min)
            min = temp;
    }
 
    temp = cnt[N-1+ 1;
    if(temp < min)
        min = temp;
 
    return min;
}
 
int main(void) {
    int N, min, tempCnt;
    cin >> N;
    int cnt[N+1];
    cnt[1= 0;
    cnt[2= 1;
    cnt[3= 1;
 
    for(int i=4; i<=N; i++) {
        cnt[i] = checkMinPath(cnt, i);
    }
 
    cout << cnt[N] << "\n";
}
cs


'C & C++ > Baekjoon' 카테고리의 다른 글

백준 2747 - 피보나치 수  (0) 2019.01.13
백준 10430 - 나머지  (0) 2017.12.28
백준 10172 - 개  (0) 2017.12.27
백준 9498 - 시험 성적  (0) 2017.12.27
백준 8958 - OX퀴즈  (0) 2017.12.27

안녕하세요.

일반적으로 C 언어를 공부하게 되면 비쥬얼 스튜디오를 깔아서 쓰는데요.

맥을 쓰면 Xcode를 공짜로 받을 수 있죠.

이 Xcode를 이용해서 C 언어를 쓰는 방법을 알려드리겠습니다.




우선 Xcode를 실행하고 Create a new Xcode project를 선택해줍니다.




OS X - Application 선택 후 Command Line Tool을 선택해줍니다.




다른거는 마음대로 입력하시고

맨 아래 Language 에서 C를 선택해줍니다.




main.c가 자동으로 생성되어 있습니다.




기본 코드도 자동으로 입력이 되어있습니다. 




왼쪽 위에 있는 재생 표시 버튼을 누르면 컴파일이 되고 오른쪽 아래에서 실행됩니다.

문제 없이 실행되네요.




시험삼아 간단하게 출력함수만 써서 컴파일 해봤는데 잘 되네요.

굳이 윈도우 환경 없이 Xcode 만으로도 C를 공부하는 데에는 지장이 없을 것 같습니다.


(추가)

1. 굳이 IDE가 필요 없으시다면 gcc 이용해서 컴파일하여 사용하는 방법도 있습니다.

2. Windows.h등과 같이 특정 OS에서만 동작하는 헤더가 필요하다면 윈도우에서 하셔야 합니다.

'Xcode' 카테고리의 다른 글

1. 새 프로젝트 시작하기  (0) 2015.06.15

+ Recent posts