입출력 관련 기본 문제

재찬·2023년 4월 8일
0

Algorithm

목록 보기
63/64

문제

10951 A+B -4

코드

#include<bits/stdc++.h>
using namespace std;

int A, B;

void output(int a, int b){
	cout << a + b << '\n';
}

int main(){
	while(cin >> A >> B){
		output(A, B);	
	}
}

풀이

입력의 끝이 정해져 있지 않았다는 사실을 간과하고 당연하게 cin cout으로만 문제를 해결하려해서 오답을 받았다.
입력의 끝이라는 표현을 할 EOF를 사용 했어야했다.
while문 안에 A와 B가 입력이 있는 동안 A+B의 값을 출력하도록 하면 됐다.

문제

11718 그대로 출력하기

코드

#include<bits/stdc++.h>
using namespace std;

string s;

void output(string s){
	cout << s << '\n';
}

int main(){
	while(getline(cin,s))
	output(s);
}

풀이

기본적인 문제였다.
띄어쓰기 문장도 그대로 입력 받는 능력을 요구하는 문제였는데 매번 사용할 때 마다 검색해서 사용해서 한번 정리했다.
getline 함수를 통해 string s에 cin 받으면 된다.
--> getline(cin,s) 하면 띄어쓰기와 상관없이 입력을 받는다.

문제

11720 숫자의 합

코드

#include <bits/stdc++.h>
using namespace std;

int cnt;
int sum;
string s;

void inputCnt(){
	cin >> cnt;
}

void input(){
	cin >> s;
}

void sol(){
	sum = 0;
	for(int i = 0; i < cnt; i++){
		sum += s[i] - 48;
	}
	cout << sum << '\n';
}

int main(){
	inputCnt();
	input();
	sol();
}

풀이

컴퓨팅 사고를 하자는 의미에서 정리했다.
"숫자를 더해라"라는 워딩에 속아 연산을 생각했는데 숫자를 문자로 생각하면 되는 간단한 문제였다.
아스키 코드 값만큼 빼서 계산하면 된다.

문제

1924 2007년

코드

#include <bits/stdc++.h>
using namespace std;

int x, y;
int months[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
string days[7] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"}; 

void input(){
	cin >> x >> y;
}

void sol(){
	int total = 0;
	int ret = 0;
	for(int i = 0; i < x-1; i++){
		total += months[i];
	}
	total += y;
	ret = total % 7;
	cout << days[ret];
}

int main(){
	input();
	sol();
}

풀이

간단한 구현 문제였다.
2번이나 오답을 받아서 이유를 도저히 찾을 수 없었으나
total과 ret을 0으로 초기화 해주니 정답이 되었다.
변수가 0으로 초기화 되지 않을 수도 있다는 점을 생각하지 않아서 정리했다.

문제

10818 최소, 최대

코드

#include <bits/stdc++.h>
using namespace std;

vector<int> input(){
	int n;
	int a;
	vector<int> v;
	cin >> n;
	for(int i = 0; i < n; i++){
		cin >> a;
		v.push_back(a); 
	}
	return v;
}

void sol(vector<int> v){
	int min = 1000001;
	int max = -1000001;
	for(auto k : v){
		if(k < min) min = k;
		if(k > max) max = k;
	}
	cout << min << " " << max << '\n';
}

int main(){
	sol(input());
}

풀이

for(auto k : v) {
	if(k < min) min = k;
    else if(k > max) max = k;
    }

일 때는 오답을 받았다.
else if 대신 if를 2개 쓴 이유에 대해 생각해야한다.

--> if 와 else if는 한 문장에 대해 하나의 조건이라고 생각한다면
if와 if는 한 문장에 대해 두 개의 잣대를 갖다 비교하는 것이라 생각하면 된다.
다시 말해, if와 else if는 if 조건에 부합하면 else if의 조건과 비교하지는 않지만 if와 if는 두 번 비교하는 것이다.

문제

2446 별 찍기 -9

코드

#include <bits/stdc++.h>
using namespace std;

int input(){
	int n;
	cin >> n;
	return n;
}

void sol(int num){
	for(int i = 0; i < num; i++){
		for(int j = 0; j < i; j++) cout << " ";
		for(int j = 0; j < 2 * (num-i) -1; j++) cout << "*";
		cout << '\n';
	}
	
	for(int i = 0; i < num -1; i++){
		for(int j = 0; j < num-i-2; j++) cout << " ";
		for(int j = 0; j < 2 * (i+2) - 1; j++) cout <<"*";
		cout << '\n';
	}
}

int main(){
	sol(input());
}

풀이

출력 형식이 계속 잘못된 문제였다.
문제의 조건을 다시 확인해보니 약간의 변칙이 있는 문제였다.
조건을 잘 확인 하자는 의미에서 정리했다.
*찍기 문제를 여러개 풀다보니 나름의 노하우?가 생겼다

  • 별 얼마만큼 찍혀 있는지 분석
    ex ) 행이 몇 개 인지 열이 몇 개인지 분석한다.
  • 별 찍는 패턴 분석
    ex ) 어떤 규칙이 반복되는지 점화식 세우기

이정도만 해도 웬만한 별 찍기는 다 해결이 되는듯 하다.
너무 당연한 소리같긴 하지만...

후기

이제까지 문제를 무작정 풀었다.
유형별로 그냥 부딪히고 해설을 참고하고 풀고 반복을 했는데 새로운 문제를 볼 때마다 풀 수 있다는 생각보다는 알 것 같은데? 본 것 같은데? 라는 생각만 자꾸 들었다.
모르는게 무엇인지 찾아야 했다.
모르는게 뭐고 부족한게 뭔지 알아내야 성장할 수 있을 듯한 느낌이 들었다.
그래서 시작했다.
입출력, DP, 그리디, 그래프, 이분 탐색, 분할 정복, 완전 탐색 모두 기본 + 응용 문제들을 풀어보며 부족한 점에 대해 체크해야겠다.
입출력 너무 쉽다고만 생각했는데 생각보다 놓치는 부분을 꽤나 찾은 것 같아서 기분이 좋았다.

0개의 댓글