#1547

문제 설명
컵 1번, 2번, 3번이 일렬로 놓여져 있다. 1번 컵 아래 공이 하나 있으며, 공은 움직이지 않는다.
임의의 두 컵을 고른뒤 그 위치를 바꾸려고 한다. 예를 들어 1번,2번 컵을 고르면 1번 컵 위치에 2번컵을, 2번컵 위치에 1번컵을 이동시킨다. 이때 공은 움직이지 않으므로 맨처음 1번컵이 있던 위치에 그대로 있다.
컵의 위치를 총 m번 바꾸고, 위치를 바꾼 방법이 주어지면 이 과정 이후 공이 들어있는 컵의 번호를 구하는 프로그램을 구해야한다.
풀이 과정
처음 문제 이해를 잘못해서 배열로 두고 그 숫자의 위치의 있는 컵들의 자리를 바꿨는데, 그게 아니라 번호가 매겨진 컵들을 바꾸는 거였다; 덕분에 코드가 조금 더러워졌지만 배열은 그대로 유지하고, while문을 통해 바꿀 컵들을 계속 입력 받으면서 이중 for문으로 cup의 번호를 직접 비교하여 위치를 바꿔주었다.
#include <stdio.h>
int main(){
int M = 0;
int X = 0, Y = 0, tmp = 0;
int cup[3] = {1,2,3}; // 각 번호의 컵 위치
scanf("%d",&M);
while(M){ // 위치를 바꾸는 반복문
scanf("%d %d",&X,&Y);
for(int i =0; i<3; i++){
for(int j = i+1; j<3; j++){
if((cup[i]==X && cup[j]==Y )||(cup[i]==Y && cup[j]==X)){ // 컵의 번호비교
tmp = cup[i];
cup[i] = cup[j];
cup[j] = tmp;
}
}
}
M--;
}
printf("%d",cup[0]);
return 0;
}
#1598

문제 설명
아래와 같은 4줄짜리 표에 왼쪽부터 수를 아래로 1부터 순서대로 적어나간다.

이 때 두 자연수를 아무거나 생각해서, 두 수 사이의 직각거리를 구하는 문제이다.

예를 들어 11과 33을 골랐을때, 동서방향거리는 6, 남북방향거리는 2로 총 직각거리는 8이 된다.
풀이 과정
썩 좋은 방법은 아닌 것 같지만 소위 말하는 노가다(...) 방식으로 문제를 풀었다.
먼저 세로간의 거리를 구분하기 위해서는 4로 나눈 나머지 값을 빼어주면 된다. 이때 4번째줄은 0이 되므로 이를 유의하여 4로 변환하여 계산해주었다. 만약 같은 줄에 있을 경우에는 0으로 처리해주었다.
다음으로 가로 거리를 구분하기 위해서 4로 나눈 몫을 생각해주었는데, 이때 4번째 줄은 몫이 다음줄과 같아지므로 따로 1을 빼서 연산을 진행해주었다. 다만 이제 줄이 같은 경우 따로 1을 뺴주지 않고 연산하였다.
그리고 위에서 연산한 세로, 가로 값을 더하면 직각거리를 구할 수 있다.
#include <stdio.h>
#include <stdlib.h>
int main(){
int N1, N2;
scanf("%d %d",&N1,&N2);
int hor = 0, var = 0; //가로, 세로 거리
if(N1 % 4 == N2 % 4){
var = 0;
}else if(N1 % 4 == 0){
var = abs(4 - (N2 % 4));
}else if(N2 % 4 == 0){
var = abs((N1 % 4) - 4);
}else{
var = abs((N1 % 4) - (N2 % 4));
}
if(N1 % 4 == N2 % 4){
hor = abs((N1/4)-(N2/4));
}else if(N1 % 4 == 0){
hor = abs((N1 / 4 -1) - (N2 / 4));
}else if(N2 % 4 == 0){
hor = abs((N1 / 4) - (N2 / 4 -1));
}else{
hor = abs((N1 / 4) - (N2 / 4));
}
printf("%d %d\n",var,hor);
printf("%d", var+hor);
return 0;
}
#1703

문제 설명
branchorama 나무는 특이한 규칙을 가지고 성장한다. 이 나무는 하나의 잎을 꼭대기에 가지며 잎에는 생장점이 있어 나무의 생장점은 여러 가지로 나뉘어 성장이 끝난 각 가지는 생장점을 가진 하나의 잎을 다시 꼭대기에 매단다.

위와 같이 이 나무는 과밀하게 성장하기에 나뭇가지를 쳐낸다. 이때 각 나무가 몇개의 잎을 가지고 있는지 알고 싶어한다. 입력으로 나무의 나이(n)가 주어지고 나뭇가지수, 쳐낸 가지의 수가 n회 주어진다. 이 때 각 나무의 잎의 수를 구해야한다.
풀이 과정
문제 이해하는 데에 상당히 헷갈렸는데 막상 이해하고 나니 별거 아닌 문제였다. 먼저 0을 입력 받기 전까지 계속 반복문을 돌도록 하였고 나뭇가지수(잎 수)와 쳐낸 가지의 수를 빼주어 남은 가지수를 구한다음, 다음 생장점의 수를 곱하는 것을 반복하여 최종 잎의 수를 구할 수 있도록 하였다.
#include <stdio.h>
int main(){
int year = 1;
int leaf, cut, answer = 0;
scanf("%d",&year);
while(year){
scanf("%d %d",&leaf,&cut);
answer = leaf - cut;
for(int i = 1; i<year; i++){
scanf("%d %d",&leaf,&cut);
answer = answer * leaf - cut;
}
printf("%d\n",answer);
scanf("%d",&year);
}
return 0;
}
'정리 > C' 카테고리의 다른 글
[C] 백준 #2010, #2441, #2442 (0) | 2023.10.01 |
---|---|
[C] 백준 #1085, #1267, #1284 (0) | 2023.09.17 |
[c] 백준 10870 (0) | 2023.08.27 |
[c] 코딩도장 파일입출력 문제 (0) | 2023.08.27 |
[c] 파일 입출력 (0) | 2023.08.27 |
댓글