1547 공
Updated:
1547 공
[Baekjoon] 1547 공, 문제 풀이.
프로그래밍 언어: C
문제
접근
처음에는 접근법이 틀렸었다. 문제를 이해하지 못했던 것 같다. 다음은 잘못된 코드이다.
#include <stdio.h>
int main(void)
{
int cnt = 0;
int input01, input02;
int cup_list[3] = { 1,0,0 }; // 1 : 공이 있음, 0 : 공이 없음 -> 교체해주면서 하면됨
scanf("%d", &cnt); // 입력 횟수
for (int i = 0;i < cnt;i++)
{
scanf("%d %d", &input01, &input02); // 교체할 컵의 번호
cup_list[input01 - 1] = input02; // 컵의 위치 변화 (배열에서)
cup_list[input02 - 1] = input01;
}
printf("%d", cup_list[0]);
return 0;
}
처음에는 컵의 번호와 컵의 위치가 동일하다고 생각했다. 즉, 컵의 위치와는 무관하게 컵의 번호만 바꾸어주면 된다고 생각했기 때문에 서로의 값만 바꾸어주면 되는 것이라고 생각했다. 문제에서 나와있는 예제는 운이 좋게 통과가 되서 이게 맞다고 생각하고 제출을 해봤으나 역시 틀렸다. 한참을 고민하면서 문제를 다시 읽어보니 컵을 들어서 옮기는 것이 아니라 컵을 끌어서, 즉 공도 컵과 같이 움직이는 것이다. 그래서 공의 위치를 파악하는 배열로 바꿀 필요가 있었다.
int cup_list[3] = { 1,0,0 }; // 1 : 공이 있음, 0 : 공이 없음 -> 교체해주면서 하면됨
문제에서 공의 초기 위치는 1번째 위치라고 했기 때문에 0번 인덱스를 1로 할당, 나머지는 0으로 할당했다. 이 배열의 값을 옮겨가며 공의 위치를 추적해주면 된다.
입력을 여러번 받는 것은 반복문으로 처리했다. 이는 파이썬과 유사한 부분이 많았기 때문에 어렵지 않았다.
scanf("%d", &cnt); // 입력 횟수
for (int i = 0;i < cnt;i++)
{
scanf("%d %d", &input01, &input02);
...
그 다음은 컵의 위치를 바꾸어주는 로직을 구성해야 하는데, 이때 경우의 수를 크게 두 가지로 나누었다.
- input01, input02 (문제에서는 X, Y)가 같다면, 아무런 행동도 취하지 않아도 된다. (옮기지 않기 때문에)
- 다르다면, 서로가 가진 할당값을 바꾸어준다.
그래서 처음에는 서로의 인덱스 값끼리만 바꾸어 주면 된다고 생각했다. 하지만 그렇게 된다면, 동시에 변수의 위치를 변화할 때 오류가 발생한다. 예를 들면 다음과 같다.
int x = 5;
int y = 7;
x = y;
y = x;
// x = 7, y = 7 (x가 7로 먼저 할당되고 y에 할당되기 때문에)
이러한 오류를 범해서 작성한 코드는 다음과 같다.
cup_list[input01 - 1] = cup_list[input02 - 1];
cup_list[input02 - 1] = cup_list[input01 - 1];
이러한 오류를 범하지 않기 위해서는 또 다른 변수를 설정해주면 된다. 임시 저장 공간을 만들어 준다고 생각하면 편하다. 다음은 수정된 코드이다.
int temp = 0; // 컵의 번호를 바꿀 때, 임시로 사용할 변수
...
// 번호가 다르다면 서로 할당된 값을 변화, 즉 공의 위치 변화
else {
temp = cup_list[input01 - 1];
cup_list[input01 - 1] = cup_list[input02 - 1];
cup_list[input02 - 1] = temp;
}
먼저 temp 변수를 선언해주고 temp을 이용하여 임시 저장, 이후에 할당해주는 식으로 바꾸었다.
마지막으로 공이 있는 컵의 위치를 출력하면 되는데 이때, 인덱스 값을 활용하기로 했다. 다만, 인덱스 값은 0부터 시작하기 때문에 결과값은 +1을 해서 출력해주자. 공의 위치는 새로운 반복문을 통해 추적했다.
// 공이 있는 컵의 위치 파악
for (int j = 0;j < 3;j++)
{
if (cup_list[j] == 1) {
result = j + 1; // 인덱스는 0부터 시작이므로, +1
}
}
}
printf("%d", result);
전체 코드
#include <stdio.h>
int main(void)
{
int cnt = 0;
int input01, input02;
int temp = 0; // 컵의 번호를 바꿀 때, 임시로 사용할 변수
int cup_list[3] = { 1,0,0 }; // 1 : 공이 있음, 0 : 공이 없음 -> 교체해주면서 하면됨
int result = 0;
scanf("%d", &cnt); // 입력 횟수
for (int i = 0;i < cnt;i++)
{
scanf("%d %d", &input01, &input02);
// 번호가 같다면 바꾸지 않은 것
if (input01 == input02) {
continue;
}
// 번호가 다르다면 서로 할당된 값을 변화, 즉 공의 위치 변화
else {
temp = cup_list[input01 - 1];
cup_list[input01 - 1] = cup_list[input02 - 1];
cup_list[input02 - 1] = temp;
}
// 공이 있는 컵의 위치 파악
for (int j = 0;j < 3;j++)
{
if (cup_list[j] == 1) {
result = j + 1; // 인덱스는 0부터 시작이므로, +1
}
}
}
printf("%d", result);
return 0;
}
개선 및 부족한 사항
- 변수끼리의 값을 바꿀 때, 즉, 동시 변환 시에 오류를 범한다. 이때는 새로운 변수를 할당하여 해결해주자.
- 문제를 파악하는 능력이 부족하다. 문제가 풀리지 않는다면 다시 한 번 문제를 꼼꼼히 읽어보자. 분명 놓친게 있을 것이다.
Leave a comment