tjsdud
2022.02.08
@tjsdud님이 새 포스트를 작성했습니다.
[13일차] 백준 16165번 : 걸그룹 마스터 준석이
📝 걸그룹 개인과 팀의 이름 검색하여 출력하는 퀴즈 프로그램 💻소스 코드 #include <iostream> #include <map> #include <vector> #include <string> #include <algorithm> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); map<string, vector<string>> group; //그룹명과 그룹 멤버 이름 저장 map<string, string> member_group; //멤버이름과 그룹 명으로 저장 int n, m, member_num, tmp; string group_name, str, quize; cin >> n >> m; while (n--) {         vector<string> member_name; //멤버 이름 저장 cin >> group_name >> member_num; while (member_num--) { cin >> str; member_name.push_back(str); member_group[str] = group_name; } sort(member_name.begin(), member_name.end()); group[group_name] = member_name; } vector<string>::iterator it; while (m--) { cin >> quize >> tmp; if (tmp == 0) { for (it = group[quize].begin(); it != group[quize].end(); it++) { cout << *it << '\n'; } } else if (tmp == 1)  cout << member_group[quize] << '\n'; } return 0; } 🔎실행 결과 💡 문제 풀이 더 간단한 방법이 있는 것 같지만 일단 나는 멤버 그룹(키), 멤버 이름 저장하는 map, 멤버 이름(키), 멤버 그룹명 저장하는 map 총 2개를 만들어서 해결했다.
tjsdud
2022.02.06
@tjsdud님이 새 포스트를 작성했습니다.
[12일차] 백준 1764번 : 듣보잡
📝 듣보잡의 수와 그 명단을 사전순으로 출력 💻소스 코드 #include <iostream> #include <string> #include <map> #include <vector> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); map <string, int> mp; vector <string> v; int n, m; cin >> n >> m; string str; while (n--) { cin >> str; mp[str]++; } while (m--) { cin >> str; mp[str]++; } map<string, int> ::iterator it; for (it = mp.begin(); it != mp.end(); it++) { if (it->second == 2) v.push_back(it->first); } cout << v.size() << '\n'; for (int i = 0; i < v.size(); i++) cout << v[i] << '\n'; return 0; } 🔎실행 결과 💡 문제 풀이 참고 https://wonsjung.tistory.com/165 처음에 vector, sort 사용해서 풀었는데 계속 시간 초과 떠서 실패했다ㅠㅠ 그래서 결국 처음부터 다시 구현했다 다시 짠 코드는 map을 사용했는데 훨씬 깔끔해지긴 했다 이름이 두 번 입력되면 값을 증가시켰고 그래서 값이 2인 경우 듣보잡이기 때문에 해당되는 키를 vector에 삽입했다. map이 vector보다 검색 속도가 빠르다고 하는데 그래서 성공했나..
tjsdud
2022.02.05
@tjsdud님이 새 포스트를 작성했습니다.
[11일차] 백준 12605번 : 단어순서 뒤집기
📝 각 케이스에 대해서 단어들을 반대 순서로 출력 💻소스 코드 #include <iostream> #include <stack> #include <string> #include<algorithm>  using namespace std; int main() { cin.tie(0); std::ios::sync_with_stdio(false); int n; stack<char> s; string str; cin >> n; cin.ignore(); for (int i = 0; i < n; i++) { getline(cin, str); reverse(str.begin(), str.end()); str += '\n'; //문자열의 끝을 나타내기 위해서 \n을 추가해 준다. cout << "Case #" << i + 1 << ": "; for (int j = 0; j < str.length(); j++) { if (str[j] == ' ' || str[j] == '\n') { while (!s.empty()) { cout << s.top(); s.pop(); } if (str[j] == ' ') cout << ' '; else cout << '\n'; } else { s.push(str[j]); } } } return 0; } 🔎실행 결과 💡 문제 풀이 단어 순서만 반대로 출력하는 것이기 때문에 먼저 reverse를 사용했다. Case#1에 대해서 예를 들면, reverse를 사용하면 tset a si siht가 저장된다. 문자열 길이만큼 반복해서 문자를 만나면 그대로 스택에 삽입하고 공백이나 문자열의 끝에 도달했을 때 pop을 한다. 그러면 먼저 tset순서로 스택에 저장되는데 스택은 가장 최근에 삽입된 것이 먼저 빠져나오기 때문에, 제일 처음 공백을 만나 pop을 하면 test가 출력이 된다. 더 간단하게 할 수 있을 것 같은데 그건 좀 더 구글링 해봐야겠다..
sua0211
2022.02.04
@sua0211님이
[10일차] 백준 1699번 : 제곱수의 합
포스트를 좋아합니다.
tjsdud
2022.02.03
@tjsdud님이 새 포스트를 작성했습니다.
[10일차] 백준 1699번 : 제곱수의 합
📝주어진 자연수를 제곱수의 합으로 나타낼 때 최소 개수 출력 💻소스 코드 #include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { int N;  cin >> N; vector<int> v(N+1); for (int i = 1; i <= N; i++) { v[i] = i; for (int j = 2; j * j <= i; j++) { v[i] = min(v[i], v[i - j * j] + 1); } } cout << v[N] << endl; return 0; } 🔎실행 결과 💡 문제 풀이 이 문제가 '다이나믹 프로그래밍'이라는 것을 알면 풀이를 이해하기 쉽다. 다이나믹 프로그래밍은 특정 범위까지의 값을 구하기 위해서 그것과 다른 범위까지의 값을 이용하여 효율적으로 값을 구하는 알고리즘 기법이다. v[i]의 값은 i의 제곱수 항의 최소 개수이고, 이것을 이용해서 v[i]와 v[i-j*j]+1의 값 중 더 작은 값을 v[i]에 저장한다. 제곱 수가 1만 존재하는 수는 최소 개수가 i와 같기 때문에 v[i] = i가 된다. ex) 3 = 1^2 + 1^2 + 1^2 자세한 풀이는 https://lmcoa15.tistory.com/43 참고 분명 이해했는데 이걸 말로 설명하려고 하니 어렵다...😂
tjsdud
2022.02.03
@tjsdud님이
[3일차] 백준 1010번 : 다리 놓기
포스트에 댓글을 남겼습니다.
yeahappy
2022.01.12
@yeahappy님이
[3일차] 백준 1010번 : 다리 놓기
포스트에 댓글을 남겼습니다.
yeahappy
2022.01.12
@yeahappy님이
[3일차] 백준 1010번 : 다리 놓기
포스트를 좋아합니다.
tjsdud
2022.01.05
@tjsdud님이 새 포스트를 작성했습니다.
[7일차] 백준 1296번 : 팀 이름 정하기
📝우승할 확률이 가장 높은 팀 이름 구하기 💻소스 코드 #include <iostream> #include <string> #include <algorithm> using namespace std; int main() { string EngName; //연두의 영어이름 int n; //팀명 후보 개수 string TeamName[50]; int L = 0, O = 0, V = 0, E = 0, output = 0; double max = 0; cin >> EngName; cin >> n; for (int i = 0; i < n; i++)  cin >> TeamName[i]; sort(TeamName, TeamName + n); for (int i = 0; i < n; i++) { L = 0, O = 0, V = 0, E = 0; for (int j = 0; j < EngName.length(); j++) { if (EngName.at(j) == 'L') L++; else if (EngName.at(j) == 'O') O++; else if (EngName.at(j) == 'V') V++; else if (EngName.at(j) == 'E') E++; } double tmp = 0; for (int k = 0; k < TeamName[i].length(); k++) { if (TeamName[i].at(k) == 'L') L++; else if (TeamName[i].at(k) == 'O') O++; else if (TeamName[i].at(k) == 'V') V++; else if (TeamName[i].at(k) == 'E') E++; } tmp = ((L + O) * (L + V) * (L + E) * (O + V) * (O + E) * (V + E)) % 100; if (max < tmp) { max = tmp; output = i; } //if (max == tmp) { //사전순으로 앞서는 팀 이름 출력 // int z; // int len = (TeamName[output].length() < TeamName[i].length() ? TeamName[output].length() : TeamName[i].length()); // for (z = 0; z < len; z++) { // if (TeamName[output].at(z) < TeamName[i].at(z)) // break; // else if (TeamName[output].at(z) > TeamName[i].at(z)) { // max = tmp; // output = i; // break; // } // else // continue; // } // if (z == len) { // if (len == TeamName[i].length()) { // max = tmp; // output = i; // } // } //} } cout << TeamName[output] << endl; return 0; } 🔎실행 결과 💡 문제 풀이 제일 처음에 문제를 제대로 안 읽어서 '사전 순'을 보지 못해 틀렸다.. 우승 확률이 같을 때는 사전 순으로 출력하기 위해서 하나하나 비교하도록 구현했는데 소스코드가 너무 길어졌다😅 생각해 보니 sort 함수 사용하면 훨씬 간결해진다! 간단한 문제이지만 생각보다 시간이 많이 걸림ㅠㅠ 일단 오늘은 브론즈 문제 계속 풀고 내일은 실버 문제 도전해 볼까 고민 중 이 실력으로 코테.. 가능할까..
tjsdud
2022.01.05
@tjsdud님이 새 포스트를 작성했습니다.
[6일차] 백준 5426번 : 비밀 편지
📝암호화된 편지를 원래 메시지로 출력 💻소스 코드 #include <iostream> #include <string> #include <cmath> using namespace std; int main() { int t; //테스트 케이스 개수 cin >> t; string str; int n, tmp; char str_rec[100][100]; char str_rec_cha[100][100]; while (t--) { int cnt = 0; cin >> str; n = sqrt(str.length()); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { str_rec[i][j] = str[cnt++]; } } for (int i = 0; i < n; i++) { tmp = n; for (int j = 0; j < n; j++) { str_rec_cha[--tmp][i] = str_rec[i][j]; } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cout << str_rec_cha[i][j]; } } cout << endl; } return 0; } 🔎실행 결과 💡 문제 풀이 배열을 2개 생성해서 배열 하나에는 암호화된 문자열을 또 다른 배열에는 원래 문자열을 저장하여 풀었다. 항상 제곱수이기 때문에 쉽게 풀 수 있었다. 암호화된 문자열이 저장된 배열을 살펴보면 원래 문자열로 변경하기 위해서 (0,0) -> (2,0) (0,1) -> (1,0) (0,2) -> (0,0) (1,0) -> (2,1) (1,1) -> (1,1) (1,2) -> (0,1) ... 이런 패턴을 확인할 수 있다. 이 패턴을 가지고 for문을 잘 활용하면 쉽게 변경 가능하다.
tjsdud
2022.01.04
@tjsdud님이 새 포스트를 작성했습니다.
[5일차] 백준 1032번 : 명령 프롬프트
📝검색 결과가 먼저 주어졌을 때, 패턴으로 뭘 쳐야 그 결과가 나오는지를 출력하는 문제 💻소스 코드 #include <iostream> #include <string> using namespace std; int main() { int N; //파일의 개수 cin >> N; string str[50]; for (int i = 0; i < N; i++) cin >> str[i]; char c; for (int i = 0; i < str[0].length(); i++) { c = str[0][i]; //첫번째 파일 이름과 나머지 모든 파일 이름 비교 for (int j = 1; j < N; j++) { if (c != str[j][i]) { c = '?'; //문자가 다르면 ? 출력 break; } } cout << c; //같으면 첫번째 파일 이름 단어 출력 } return 0; } 🔎실행 결과 💡 문제 풀이 첫 번째 입력한 파일 이름과 나머지 파일 이름을 각각 비교해 주면 된다. 참고 : https://1nnovator.tistory.com/30
tjsdud
2021.12.29
@tjsdud님이 새 포스트를 작성했습니다.
[4일차] 백준 1015번 : 수열 정렬
📝배열 A가 주어졌을 때, 수열 P를 적용한 결과가 비내림차순이 되는 수열 찾기 💻소스 코드 #include <iostream> #include <algorithm> using namespace std; int main() { int N; pair<int, int> p[50]; int tmp[50]; cin >> N; for (int i = 0; i < N; i++) { cin >> p[i].first; p[i].second = i; } sort(p, p + N); for (int i = 0; i < N; i++) { tmp[p[i].second] = i; } for (int i = 0; i < N; i++) { cout << tmp[i] << " "; } return 0; } 🔎실행 결과 💡 문제 풀이 https://kyunstudio.tistory.com/106 처음에 단순히 배열로만 생각해서 풀었더니 틀렸다 :( 같은 수가 여러 개 있는 경우를 해결하지 못 했음 그래서 결국 구글링..😂 실버 문제인 만큼 풀이가 굉장히 단순했다