10월, 2019의 게시물 표시

입력 과정에서 버퍼 처리에 관한 실수

C++의 입력을 담당하는 라이브러리 함수 중에서 cin과 getline이 있다. cin과 getline의 차이를 앎에도 불구하고, 실수를 할 때가 있다. 바로 섞어서 사용할 때다. cin은 띄어쓰기(스페이스 : ' ')와 줄바꿈(엔터 : '\n')를 기준으로 잘라서 입력을 받는다. 다시 말해서, 저 두 문자를 만나면 데이터 하나에 대한 입력이 끝나는 것이다. 여기서 눈에 보이지는 않지만, 버퍼에 문자가 남게 된다. 우리가 입력을 받을 때, cin만 쓴다면 버퍼에 남아있어도 자동으로 무시하기 때문에 어떠한 문제가 발생하지 않는다. getline은 함수의 특성상 버퍼에 문자를 남기지 않는다. 또한, 구분자가 없이 모든 입력을 그대로 받기 때문에 문자열을 받을 때 사용하곤 한다. getline도 그 자체만으로는 어떠한 문제를 발생시키지 않는다. 그러나 cin -> getline을 하는 경우에는 문제가 발생할 수 있다. cin을 사용하면 버퍼에 띄어쓰기나 줄바꿈 문자가 남아있게 되고, 여기서 getline을 사용하면 버퍼에 남아있는 문자를 그대로 받게 된다. 따라서, 같이 사용하는 경우에는 버퍼 처리를 꼭 해주어야 한다. 버퍼에 남아있는 문자가 의미없는 경우 cin.ignore();를 통해서 버퍼를 비우면 된다. cin -> cin.ignore -> getline 순서가 되는 것이다. * C의 scanf와, Java의 new Scanner(System.in).next도 마찬가지로 버퍼에 남긴다. 사용하는 언어가 달라도 입력 라이브러리 함수에 대해서는 사용 목적에 따라 꼭 버퍼 처리를 확인하고 처리하는 습관을 갖자.

프로그래머스 2019 윈터코딩 온라인 테스트를 보았다. (풀이)

이미지
첫 번째 문제에서 테스트케이스의 일부분이 실패하길래 디버깅하다가 1시간을 쓴 것 같다.. (0이 들어오진 않고, 로직은 맞았으나 형 변환을 하지 않아서 틀렸다.) - 19/11/16 많이 아쉬웠던 건 모든 문제에 대해서 접근 방법과 구현 방법이 떠올랐는데, 제대로 된 정답을 내지 못한 것이다. 대체로 요번 윈터코딩에서는 규칙성을 찾는 문제 위주로 나온 것 같다. 2번 문제는 정답이지만, 1번 부분점수 상태에서 디버깅 하다가 3번을 제대로 못풀고.. 그래서 아쉬운 대로 내가 풀었던 방법을 적어놓고자 한다. (현재 모든 문제 해결하였습니다.) #1 멀쩡한 사각형 N x M 격자판에 양 꼭짓점으로 대각선을 하나 그었을 때,  직선에 걸치는 사각형을 전체 사각형의 개수에서 빼는 문제이다. 격자의 최소 단위는 1 x 1로 이루어져 있고, w와 h가 주어진다. (범위는 1억까지) 규칙을 찾다가, 정사각형일 때와 아닐 때 를 생각해보았다. 정사각형인 N x N 형태이면, 대각선으로만 걸치므로 w * w - w를 하면 된다. 정사각형이 아닌 N x M 형태이면,  선에 걸치는 사각형들이 오른쪽 또는 아래를 걸쳐서 선을 타고 내려오는 모습이 된다. (그림 참조) 3x3 사각형과 8x12 사각형 대각선이 아닌 오른쪽 또는 아래로만 거쳐서 선에 걸치는 사각형만 있으면 생각하기 쉽다. 그러나, 문제에서 주어진 예제 테스트케이스로 w=8, h=12를 생각해보면 중간마다 정사각형일 때 처럼, 대각선으로 걸치는 경우도 있다. 이 경우가 언제인지를 생각해보자. 그림에서 보면 정확히 2 x 3지점에서 대각선으로 걸치고 있다. 그리고 전체가 2 x 3인 사각형들을 4번 대각선으로 붙인 모습이다. 여기서 생각해볼 수 있는 건 이 2 x 3이 현재 전체 사각형들이 대각선으로 걸치는 최소 단위라는 것이다. 직선이므로, 내부에 존재하는 부분 직선도 ...

안녕하세요!

이미지
프로그래밍에 관심이 많은 Jang입니다. 부족하지만 발전하는 블로거가 되도록 하겠습니다. ^^