알고리즘 문제 복습 풀이 - 배열, 연결리스트

REASON·2022년 10월 10일
0

복습

목록 보기
12/12
post-custom-banner

배열 문제 복습

10808 알파벳 개수

소문자 알파벳으로만 이루어져 있다고 했기 때문에 총 26개의 a~z까지의 소문자 알파벳만 카운트 해주면 된다.
카운트 할 배열을 하나 만들어 준 후 문자를 입력받음과 동시에 배열에 등장한 소문자를 1씩 카운트 시켜주고 해당 배열을 출력해주면 되는 문제이다.

풀이 코드

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

char arr[26];

int main(void) {
  
  string s;
  cin >> s;
  
  for(int i = 0; i < s.size(); i++){
  	arr[s[i] - 'a']++;
  }
  
  for(int i : arr){
	cout << i << " ";
  }
}

2577 숫자의 개수

string으로 만들어서 잘라서 처리하는게 제일 간단할 것이라 생각해서 string으로 A×B×C 를 모두 곱한 값을 넣었다.
이 과정에서 숫자를 문자열로 변환을 .. C++에서 어떻게..했더라..?ㅋㅋㅋㅋ 하다가 아 맞당 to_string() ..

풀이 코드

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

int ret[10];
int A, B, C;

int main(void) {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> A >> B >> C;	

	string mul = to_string(A * B * C);

	for(int i = 0; i < mul.size(); i++){
		ret[ mul[i] - '0' ]++;
	}
	
	for(int i : ret){
		cout << i << "\n";
	}
	
}

연결 리스트 문제 복습

1406 에디터

C++ STL을 사용해서 풀었다.
자바스크립트로 이 문제 풀어볼까 싶기도 한데 이중 연결 리스트부터 구현할 생각에 접어두었다.

STL list 너무 오랜만에 써봐서 중간에 추가 어떻게 하더라하고 구글링해서 아 맞다 insert ㅎ..ㅎㅎ..
근데 중간 로직이 뭔가 잘못 짜였는지 마지막 TC가 저렇게 무한하게 나와버림.ㅠㅠ 왜인가 생각해보니 이터레이터를 이동 안시켜서 그렇다는 것을 깨달았다.

한달 전에 풀었었던 문제인데 그래도 이정도 기억이면 괜찮지 않을까.....(?)아닌가..ㅋㅋㅋ
아무튼 까먹은 List insert, erase 사용 방법을 다시 기억해놔야겠다.

메모
insert(iterator, element) : iterator 앞에 원소 추가
erase(iterator) : iterator 위치의 원소 삭제 후 다음 원소 위치 반환

풀이 코드

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

int main(void) {
	ios::sync_with_stdio(0);
	cin.tie(0);

	string s;
	cin >> s;
	
	list<char> L;
	
	for(char c : s){
		L.push_back(c);
	}
	
	list<char>::iterator cursor = L.end();
	
	int M;
	cin >> M;
	
	for(int i = 0; i < M; i++){
		char input;
		cin >> input;
		
		if(input == 'L'){
			if(cursor == L.begin()) continue;
			cursor--;
			
		} else if (input == 'D'){
			if(cursor == L.end()) continue;
			cursor++;
			
		} else if (input == 'B'){
			if(cursor == L.begin()) continue;
			cursor--;
			cursor = L.erase(cursor);
			
		} else if (input == 'P'){
			char addChar;
			cin >> addChar;
			
			L.insert(cursor, addChar);
		}
	}
	
	for(auto ret : L){
		cout << ret;
	}
	
}

string으로 받은 문자열을 list에 하나씩 push시켜놓고 문제에서 초기에 커서는 문장의 맨 뒤에 위치했다고 했으므로 L.end()로 위치를 잡아주었다.
이후 for문 돌릴 횟수를 받고 for문을 돌리면서 L, D, B, P에 따라 if-else 문을 통해 해당 로직을 실행시킨다.
L과 B는 맨 앞에 커서가 위치했을 때, D는 맨 뒤에 커서가 위치하고 있을 때 continue 처리해주어야 한다.
그게 아니라면 커서의 위치만 이동 시켜주면 된다.
B 인 경우에 erase 해주어야 하므로 커서의 위치를 한칸 앞으로 이동시킨 후 erase 해야 한다. (안그러면 위에처럼 무한루프 지옥을 볼 수 있음)
P의 경우 추가할 문자를 받고 커서의 위치에 추가시켜주면 된다.

list로 풀면 된다는 것을 이미 알고 풀어서 쉬웠지 몰랐으면 이게..뭐지..했을 것 같은 문제

post-custom-banner

0개의 댓글