23-06-27 계륵 일기

E woo·2023년 6월 27일

계륵 일기

목록 보기
4/31
post-thumbnail

별 찍기 문제

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 을 쓰지 않고 형식이 정해져 있는
줄의 입력이라면 그냥 해당 형식에 맞게 각각 입력을 받으면 된다.

profile
뒘벼

0개의 댓글