컴퓨터기본/문제풀이

[이것이~] 15. 구현

차가운오미자 2021. 6. 14. 22:06

 

출처:

https://www.youtube.com/watch?v=QhMY4t2xwG0&list=PLVsNizTWUw7H9_of5YCB0FmsSc-K44y81&index=15

 

 

문제1) 시간 속에 3이 포함되어 있는가

입력받는 숫자 n 은 '시'이다.

n시 59분 59초까지 3이 들어가는 시간의 경우의 수를 구하라.

#include <iostream>
#include <vector>

using namespace std;

int main(void){
	
	int h, m1, m2, s1, s2, cnt;
	cin >> h;
	
	for(int i = 0; i<=h; i++){
		for(s2 = 0;s2<10; s2++){
			for(s1 = 0; s1<6; s1++){
				for(m2 = 0; m2<10; m2++){
					for(m1 = 0; m1<6; m1++){
						if(s2 == 3 || s1 == 3
						|| m2 == 3 || m1 == 3
						|| i == 3 || i==13 || i==23){
							cnt++;
							//cout << i << ":" << m1 << m2 << ":" << s1 << s2<< endl;
						}
					}
				}
			}
		}
	}
	cout << cnt;
}

 

풀이:

시에 3이 들어가는 경우는 3시, 13시, 23시밖에 없으니 하드코딩으로 해주었고,

루프는 0~n시까지, 0분부터 59분까지, 0초부터 59초까지를 돌리는데, 각 자리 수에 3이 들어가기 때문에 그냥 0~59를 루프돌리면 힘드므로 0~59를 자리별로 s1, s2, m1, m2 로 나누어서 돌렸다.

 

하루에 시간은 24*60*60 초밖에 안되서 brute-force 방식으로 해도 충분해서 그냥 반복문을 쓰면 된다.

 

문제2) 왕실의 나이트

특정 위치가 주어지면 그 위치에서 움직일 수 있는 position이 몇 가지인지 구하는 문제이다.

 

예전에 비슷한 문제를 풀다가 못푼적이 있는데, 방향 벡터를 사용하면 훨씬 편리하다.

나이트가 특정 위치에서 어디로 움직일 수 있는지를 방향벡터로 정리한 뒤, 각 움직임 별로 판에서 벗어나는지만 확인하면 된다. 판은 8*8 이라고 미리 주어져서 되게 간단하게 풀 수 있다.

 

#include <iostream>

using namespace std;

int main(void){
	
	int posy;
	char posx;
	string str;
	
	cin >> str;
	
	posy = str[1] - '0';
	posx = str[0];
	
	//cout << "posx: " << posx << " posy: " << posy << endl;
	int dx[8] = {-1, -2, -2, -1, 1, 2, 2, 1};
	int dy[8] = {-2, -1, 1, 2, 2, 1, -1, -2};
	
	int ny;
	char nx;
		
	int cnt =0;
	
	for(int i = 0; i<8; i++){
		nx = posx + dx[i];
		ny = posy + dy[i];
		//cout << "(" << nx << ", " << ny << ") \n";
		
		if(ny>=1 && ny<=8 && nx>='a' && nx<='h'){
			cnt++;
		}
	}
	
	cout << cnt;
}

 

조금 헷갈릴 수 있는게 x축이 a, b, c,... 이런식으로 알파벳으로 되어 있다는 것인데, 입력은 알파벳으로 되니까 이걸 숫자로 변환해서 돌리던가 아니면 위에 코드처럼 그냥 알파벳 그대로 연산해도 충분하다.

 

문제3) 문자열 재정렬

문자열을 받으면 알파벳부터 쭉 정렬해서 출력하고 마지막엔 그 문자열에 포함된 숫자들의 합을 출력한다.

 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main(void){
	
	string str;
	int sum = 0;
	vector<char> v;
	
	cin >> str;
	
	for(int i = 0; i<str.size(); i++){
		if(str[i] <= '9'){
			sum = sum+ str[i]-'0';
		}
		else{
			v.push_back(str[i]);
		}
	}
	
	sort(v.begin(), v.end());
	
	for(vector<char>::iterator it = v.begin(); it<v.end(); it++){
		cout << *it;
	}
	cout << sum;
}

'컴퓨터기본 > 문제풀이' 카테고리의 다른 글

[백준] 2231번, 7568번  (0) 2021.06.19
[백준] 10870번, 10872번, 2798번  (0) 2021.06.14
[백준] 10828번, 1991번  (0) 2021.06.14
[이것이~] 탐욕법, 구현  (0) 2021.06.14
[프로그래머스] 정렬 > K번째수  (0) 2021.06.14