2014년 7월 19일 토요일

2669 직사각형 네개의 합집합의 면적 구하기

직사각형의 4개의 좌표를 입력받고, 겹쳐진 직사각형들이 이루는 면적을 구하는 문제이다.
이 문제는 주어진 좌표만큼 그래프에 점을 찍고, 다 찍은 다음에 점의 갯수를 구해서 출력해주면 된다.

소스

3054 피터팬 프레임

단어를 꾸며서 나오는데, 3의 배수인 단어만 특별한 문자로 꾸미는 문제이다.
단어마다 한칸씩 달라붙어 있어서, 특별한 문자가 일반 문자를 덮는 꼴이 되어야 한다.

각 줄마다 공식을 잡아서 바로바로 출력해줘도 되지만,
내가 한 방법은 출력하기 전에 배열을 잡아서 거기다가 넣고 나중에 한번에 출력하는 방법이다. 이 방법의 장점은 달라붙어있는 단어 때문에 생기는 복잡한 점을 해결해 준다는대에 있다. 또한 출력은 가로방향으로 밖에 할 수 없어서 여러 조건을 붙이게 되는데, 그것을 해결해 준 것이기도 하다.

2816 디지털 티비

티비 채널 중에 KBS1을 첫번째로, KBS2를 두번째로 옮기는 방법을 묻는 문제이다.
최대 100개의 채널이 주어지고, 500번의 기회안으로 옮겨야 되는데, 옮기는 방법은 다음과 같다.

1. 화살표를 한 칸 아래로 내린다. (채널 i에서 i+1로)
2. 화살표를 위로 한 칸 올린다. (채널 i에서 i-1로)
3. 현재 선택한 채널을 한 칸 아래로 내린다. (채널 i와 i+1의 위치를 바꾼다. 화살표는 i+1을 가리키고 있는다)
4. 현재 선택한 채널을 위로 한 칸 올린다. (채널 i와 i-1의 위치를 바꾼다. 화살표는 i-1을 가리키고 있다)

이 문제를 푸는 간단한 방법은 KBS1을 찾을 때 까지 1번으로 채널을 내리고, KBS1을 처음 까지 4번으로 채널을 올린다. KBS2도 마찬가지로 1번으로 내려가고, 두번째 까지로 4번으로 올리면 된다.
채널 수가 총 100개이기 때문에 각 채널을 1,4번으로 옮기는 최악의 경우는 200번. 채널이 2개이기 때문에 최대 400번의 기회로 옮기는것이 가능하다.

소스

9469 폰 노이만

서로 반대편에서 달려오는 두 기차사이에 파리가 왔다갔다 하고 있다.
두 기차가 부딪힐 때 까지 파리가 움직이는 거리는 얼마인지를 구하는 문제이다.
처음엔 반복문을통해 실제 움직인 거리를 계산하려 했으나..
소숫점 연산의 복잡함을 깨닫고 공식으로 풀게 되었다.

처음 거리가 D이고 두 기차의 속도가 각각 A,B이고, 파리의 속도가 F라면
두 기차가 부딪힐때 까지의 시간은 D/(A+B)가 되고 파리는 그 시간동안 왔다갔다 하기 때문에 결과적으로 D/(A+B)*F가 파리의 이동거리가 된다.

역시 수학은 잘하고 봐야해..

소스

7513 준살 프로그래밍 대회

단어 목록에서 단어를 찾아 이어붙여 출력하는 문제이다.
단순히 배열에 단어를 집어넣고 주어지는 인덱스대로 단어를 출력해주면 된다.

소스

9610 사분면

해당 좌표가 몇사분면에 있는지 혹은 축에 있는지를 판별하는 문제이다.
간단하게 x,y좌표의 부호와 0의 여부만 밝히면 된다.

소스

1764 듣보잡

듣도못한 사람과, 보도못한 사람에 둘 다 포함되면 듣도보도못한 사람이 된다.
이 듣도보도 못한 사람의 숫자와, 정렬되어있는 리스트를 뿌려주는 문제이다.

처음엔 듣도못한 사람, 보도못한사람을 정렬시켜주고, 거기서 듣도보도못한 사람을 추출해주는 방법으로 문제를 풀었다. TLE가 나기 쉬우므로 qsort와 bsearch를 이용했다.
그런데 다른사람의 소스를 보니, 굳이 둘 모두의 배열을 선언할 필요는 없었다.
따라서 듣도못한 사람을 배열에 저장하고, 보도못한사람을 한명씩 받아서 search한다.
있으면 듣도보도 못한 사람에 넣고, 모든 작업이 끝나면 듣도보도못한 사람을 정렬하여
처음부터 뿌려주면된다.

소스