https://www.acmicpc.net/problem/2444
N = int(input())
line_N = 2 * N - 1
arr = [0 for i in range(line_N)]
arr[line_N // 2] = 1
middle = line_N // 2
for i in range(line_N):
if (i < line_N // 2):
for j in range(middle + i + 1):
if arr[j] == 0:
print(" ", end="")
else :
print("*", end="")
print()
arr[middle - (i + 1)] = 1
arr[middle + (i + 1)] = 1
else :
for j in range((line_N - 1) - (i - middle) + 1):
if arr[j] == 0:
print(" ", end="")
else :
print("*", end="")
print()
arr[(line_N - 1) - (i - middle)] = 0
arr[(i - middle)] = 0
N = int(input())
for i in range(1,N):
print(' '*(N-i)+'*'*(2*i-1))
for i in range(N,0,-1):
print(' '*(N-i)+'*'*(2*i-1))
위의 저렇게 긴 코드가 규칙과 수식을 잘 정하면
이렇게 짧아질 수 있다.
구현하고 규칙과 수식에 대해 더 자세히 살펴보자.
백준의 별 찍기 문제를 풀 때

별 뒤에 공백이 있는지 없는지 확인해보자...
별 뒤에 공백까지 출력하면 출력 형식으로 틀리게 된다.
https://www.acmicpc.net/problem/25206
#include <iostream>
#include <string>
#include <sstream>
#include <stack>
#include <algorithm>
#include <vector>
#include <ctype.h>
using namespace std;
int main()
{
double sum = 0;
double credit_sum = 0;
for (int i = 0; i < 20; i++)
{
string str;
getline(cin, str);
vector<string> my_v;
stringstream ss(str);
string temp;
double credit = 0;
while (getline(ss, temp, ' '))
{
my_v.push_back(temp);
}
if (my_v[2] != "P")
{
credit = stod(my_v[1]);
credit_sum += credit;
}
if (my_v[2] == "A+")
{
sum += credit * 4.5;
}
else if (my_v[2] == "A0")
{
sum += credit * 4.0;
}
else if (my_v[2] == "B+")
{
sum += credit * 3.5;
}
else if (my_v[2] == "B0")
{
sum += credit * 3.0;
}
else if (my_v[2] == "C+")
{
sum += credit * 2.5;
}
else if (my_v[2] == "C0")
{
sum += credit * 2.0;
}
else if (my_v[2] == "D+")
{
sum += credit * 1.5;
}
else if (my_v[2] == "D0")
{
sum += credit * 1.0;
}
else if (my_v[2] == "F")
{
sum += credit * 0.0;
}
}
cout << sum / credit_sum;
return 0;
}
#include <iostream>
using namespace std;
int main() {
string name, grade;
double credit;
double sumCredit = 0.0;
double temp;
double res = 0.0;
for(int i = 0; i < 20; i++) {
cin >> name >> credit >> grade;
if(grade == "P") continue;
sumCredit += credit;
if(grade == "F") continue;
if(grade[0] == 'A') temp = 4;
else if (grade[0] == 'B') temp = 3;
else if (grade[0] == 'C') temp = 2;
else temp = 1;
if (grade[1] == '+') temp += 0.5;
res += credit * temp;
}
cout << res / sumCredit;
return 0;
}
굳이 stringstream 을 쓰지 않고 형식이 정해져 있는
줄의 입력이라면 그냥 해당 형식에 맞게 각각 입력을 받으면 된다.