항해 99클럽 코테
99클럽 코테 스터디 9일차 TIL
metamong-data
2024. 11. 5. 14:57
728x90
반응형
오늘의 학습 키워드
해시
과제
## 문제
창영이는 민균이의 컴퓨터를 해킹해 텍스트 파일 하나를 자신의 메일로 전송했다. 파일에는 단어가 한 줄에 하나씩 적혀있었고, 이 중 하나는 민균이가 온라인 저지에서 사용하는 비밀번호이다.
파일을 살펴보던 창영이는 모든 단어의 길이가 홀수라는 사실을 알아내었다. 그리고 언젠가 민균이가 이 목록에 대해서 얘기했던 것을 생각해냈다. 민균이의 비밀번호는 목록에 포함되어 있으며, 비밀번호를 뒤집어서 쓴 문자열도 포함되어 있다.
예를 들어, 민균이의 비밀번호가 "tulipan"인 경우에 목록에는 "napilut"도 존재해야 한다. 알 수 없는 이유에 의해 모두 비밀번호로 사용 가능하다고 한다.
민균이의 파일에 적혀있는 단어가 모두 주어졌을 때, 비밀번호의 길이와 가운데 글자를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 단어의 수 N (2 ≤ N ≤ 100)이 주어진다. 다음 N개 줄에는 파일에 적혀있는 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 소문자로만 이루어져 있으며, 길이는 2보다 크고 14보다 작은 홀수이다.
출력
첫째 줄에 비밀번호의 길이와 가운데 글자를 출력한다. 항상 답이 유일한 경우만 입력으로 주어진다.
풀이 과정
- 입력 받을 줄 수를 input으로 입력 받고
- ::-1을 이용해서 dreverse에 뒤 집은 글자를 추가 해준다
- for 문을 이용해서 정상 글자에 뒤집은 글자가 있는지 확인 한다.
- 일치하는 글자가 있을 경우 answer에 추가
- 일치하는 글자의 0번째에서 길이와 가운데 글자를 반환
제출 코드 (python)
d = []
dreverse = []
answer = []
num = int(input())
for i in range(num):
word = input()
d.append(word)
dreverse.append(word[::-1])
for i in d :
if i in dreverse:
answer.append(i)
print(len(answer[0]), answer[0][len(answer[0])//2])
다른 언어로 문제 풀기
GO 언어
package main
import (
"fmt"
"strings"
)
func main() {
var n int
fmt.Scan(&n)
d := make([]string, 0)
dreverse := make([]string, 0)
answer := make([]string, 0)
for i := 0; i < n; i++ {
var word string
fmt.Scan(&word)
d = append(d, word)
// 문자열 뒤집기
runes := []rune(word)
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
dreverse = append(dreverse, string(runes))
}
for _, word := range d {
if contains(dreverse, word) {
answer = append(answer, word)
}
}
if len(answer) > 0 {
fmt.Println(len(answer[0]), string(answer[0][len(answer[0])/2]))
}
}
func contains(slice []string, item string) bool {
for _, s := range slice {
if s == item {
return true
}
}
return false
}
C++
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<string> d;
vector<string> dreverse;
vector<string> answer;
for(int i = 0; i < n; i++) {
string word;
cin >> word;
d.push_back(word);
// 문자열 복사 후 뒤집기
string reversed = word;
reverse(reversed.begin(), reversed.end());
dreverse.push_back(reversed);
}
for(const string& word : d) {
// find 함수를 사용하여 dreverse에서 word 찾기
if(find(dreverse.begin(), dreverse.end(), word) != dreverse.end()) {
answer.push_back(word);
}
}
if(!answer.empty()) {
cout << answer[0].length() << " " << answer[0][answer[0].length()/2] << endl;
}
return 0;
}
오늘의 회고
- 문제를 이해하는데 너무 오래 걸려서 시간 안에 해결하지 못 한 것 같다.
- 변수의 초기화를 잘 해주고, 문제를 여러 유형을 잘 이해하기 위해 복습을 해야 할 것 같다.
728x90