찹모찌의 기록일지
단계별로 풀어보기 2단계: 조건문 본문
네 백준의 단계별로 풀어보기 2단계를 풀었습니다.
1단계에서는 그렇게 어렵다고 생각이 들진 않았습니다. 따옴표나 역슬래시 출력 같은 경우의 노가다 문제들이 다분했습니다.
그래서 2단계인 조건문도 어려워봤자 if문 &&나 ||를 활용하는 선에서 끝나지 않을까 생각하고 접근했는데 은근 난이도가 있는 문제들이 있어 소개해드리고자 합니다.
- 백준 2525번: 오븐 시계
오븐 시계 문제인데요. 문제 자체는 간단합니다. 시와 분이 주어지고 오븐 조리 시간이 주어집니다. 그러면 현재 시간 + 오븐 조리 시간 을 시와 분의 형태로 출력하면됩니다.
문제는 오븐 조리 시간이 범위가 1000까지라는데 있습니다. 1000까지 있으니까 최대로 더해질 수 있는 시간이 16시간 하고도 40분이 되겠네요. 이렇듯 분이 60분이 넘칠 때마다 시간을 카운트해줘야 합니다. 이 부분을 주의깊게 신경써줘야 했네요.
따라서 문제 단계는 조건문이었지만 결국 while문을 사용해서 풀었던 문제였습니다.
#include <iostream>
using namespace std;
int main(void)
{
int a,b,c;
int h,m;
cin>>a>>b;
cin>>c;
h=c/60;
m=c%60;
a+=h;
b+=m;
while(b>59)
{
b-=60;
a++;
}
while(a>23)
{
a-=24;
}
cout<<a<<" "<<b<<endl;
return 0;
}
해답 코드는 위와 같습니다. 현재 시와 분을 입력 받고 요리에 필요한 시간을 입력받은 후 시간은 60나누기로 분은 60의 나머지로 구해준 뒤 더한 후 시와 분의 형식을 맞췄습니다. while문을 통해 계속 반복해서 계산할 수 있도록 했구요.
조금 고민이 필요한 문제였습니다.
- 백준 2480번: 주사위 세개
문제 자체는 간단합니다. 주사위 세개를 굴렸을 때 같은 눈이 3개가 나오면 해당 눈의 10000+(같은 눈)x1000을 출력, 같은 눈이 두개면 해당 눈을 같은 눈으로 하고 1000+(같은 눈)X100 모두 다른 눈이 나오면 가장 큰눈x100을 출력합니다.
처음 문제를 봤을 때 고민을 굉장히 많이 했습니다. 각각 경우의 수를 모두 조건문으로 써서 풀 것인지 아니면 다른 방법을 생각할 것인지...
그냥 편하게 모두 조건문으로 써서 풀려다가 그래도 그동안 온갖 과제와 시험을 겪으면서 풀어온 것들이 있는데 그렇게 풀기엔 자존심이 상했습니다.
그래서 고민을 해서 결국 저만의 방법으로 해결했습니다.
#include <iostream>
using namespace std;
int main(void)
{
int a[3]={0,};
int countA=0;
int countB=3;
int same=0;
cin>>a[0]>>a[1]>>a[2];
int max=a[0];
for(int i=0; i<3; i++)
{
if(max<a[i])
max=a[i];
for(int j=0; j<3; j++)
{
if(a[i]!=a[j])
countA++;
}
if(countB>countA)
{
same=a[i];
countB=countA;
}
countA=0;
}
if(countB==0)
cout<<10000+same*1000<<endl;
else if(countB == 1)
cout<<1000+same*100<<endl;
else
cout<<max*100<<endl;
return 0;
}
위의 코드가 해답 코드인데요. 그렇게 깔끔한 코드라고는 못하겠습니다. 조금더 최적화를 할 수도 있겠지만 일단은 위의 과정대로 풀었습니다.
설명을 해드리면, 먼저 반복문을 사용하기 위해 a,b,c로 입력 받지 않고 a[3]의 배열의 형태를 사용했습니다. 배열을 이용해서 입력을 받았구요. 주사위 눈이 3개가 다 다를 경우에 사용하기 위해 max변수를 사용했습니다. 반복문을 사용해서 구해주었습니다.
중요했던 부분은 countA와 countB의 부분입니다.
반복문을 돌려서 구할 때 주사위 눈이 3개가 동일한 경우와 주사위 눈이 3개가 다 다를경우는 쉽게 구할 수 있지만, 두개의 눈만 같고 하나가 다를 경우가 문제였다.
그럴 경우 총 3가지의 경우가 나오는데,
A A B
A B A
B A A
위의 경우가 나온다.
따라서 이중 반복문을 사용하여 각 위치에서의 동일하지 않은 갯수를 구한다.
순서대로 index의 값을 배열의 3개의 값들과 비교하여 동일하지 않은 갯수를 카운팅한다. 그게 바로 countA의 값이다.
그러면 제일 동일하지 않은 갯수가 작을 때를 최종 countB의 값을 넣어준다. 그리고 갯수가 작을 때의 눈의 값을 same의 값으로 결정한다.
위와 같은 방식을 통해 3개의 눈이 같을 때, 2개의 눈이 같을 때, 모든 눈이 다를 때의 경우를 계산할 수 있다.
위의 문제도 단순히 조건만 많이 달면 풀 수 있는 문제였겠지만 반복문을 사용해 조금이라도 조건문 사용을 줄이고자 했다.
2단계도 1단계와 난이도가 비슷할 것이라 생각했는데 은근 어렵게 나오는것 같다 다음 단계 대비를 철저히 해야겠다.
'알고리즘' 카테고리의 다른 글
단계별로 풀어보기 4단계: 1차원 배열 (0) | 2022.07.28 |
---|---|
단계별로 풀어보기 3단계: 반복문 (0) | 2022.07.07 |
단계별로 풀어보기 1단계: 입출력과 사칙연산 (0) | 2022.07.01 |
안녕하세요. 찹모찌입니다. 알고리즘 공부를 시작할 계획입니다. (0) | 2022.06.30 |