scanf성공적으로 받아온 수를 return합니다.

만약 에러가 발생하거나 EOF(End of File)을 만나면 -1을 리턴합니다.


EOF는 콘솔에서 ctrl + Z로 입력이 가능합니다.


문자열을 끝날 때 까지 입력 받는 방법!


1
2
3
1. while (scanf("%d"&n) != EOF)
2. while (scanf("%d"&n) != -1)
3. while (~scanf("%d"&n))
cs


EOF는 -1을 나타내므로 1과 2는 같은 방법입니다.


3번에 대해서 설명하겠습니다!


~는 NOT입니다.

NOT을 왜쓰냐!


-1은 2진수로 표현하면 1111 1111 ... 1111 입니다.

-1에 ~를 붙이면 0000 0000 ... 0000 즉 0이 됩니다.

그래서 scanf로 EOF(-1)을 받으면 0을 반환해서 while문을 빠져나올 수 있는 것입니다.


'알고리즘 > 문제풀이 팁' 카테고리의 다른 글

방향 변환 팁  (1) 2017.04.04

문제를 풀다보면 무언가에 반사되거나 부딪혀서 방향이 꺾이는 문제를 볼 수 있습니다.

아래의 그림이 예시입니다.



행을 x로, 열을 y로 쳤을 때


1
2
3
int dx[4= {-1100};
int dy[4= {00-11};
cs


dx[0], dy[0] 은 위, dx[1], dy[1]은 아래

dx[2], dy[2] 은 왼쪽, dx[3], dy[3]은 오른쪽

입니다.


처음에 문제를 이렇게 해결했었습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int move(int direct, int mirror)
{
    if(mirror == 0return direct;
    switch(direct)
    {
    case 0:
        if(mirror == 1return 3;
        else return 2;
        break;
    case 1:
        if(mirror == 1return 2;
        else return 3;
        break;
    case 2:
        if(mirror == 1return 1;
        else return 0;
        break;
    case 3:
        if(mirror == 1return 0;
        else return 1;
        break;
    }
}
cs


그림을 그려보고 방향과 반사되는 면에 일일이 경우를 나눴습니다.

그리고.. 다른 사람의 코드를 분석하던 중에.....


1
2
3
4
5
6
int move(int direct, int mirror)
{
    if(mirror == 0return direct;
    else if(mirror == 1return 3 - direct;
    else return (direct + 2) % 4;
}
cs


이렇게 간단한 소스를 찾을 수 있었습니다.

원리는 잘 모르겠으나... 하나씩 대입해보니 일치했습니다.

방향 변환하는 것이 자주 나오니깐... 이렇게 시간을 단축할 수 있겠습니다.!

'알고리즘 > 문제풀이 팁' 카테고리의 다른 글

scanf로 EOF까지 입력 받기 팁  (0) 2017.07.06

+ Recent posts