Machineboy空
Excercism - Anagram 본문
문제요약
Anagram 인지 확인하라!
난이도
Medium
풀이 포인트
- 아이디어 1: 구성된 요소가 같다면 지워가는 방식
- 아이디어 2: 정렬해서 같은지 판단하는 방식
https://machineboy0.tistory.com/269
C++ 기초 문법 다지기 예제 모음4 - 함수
프로그램의 일부 로직을 함수를 사용하여 별도로 추상화하면 코드가 더 읽기 쉬워지고 유지보수도 용이하다. 함수는 복잡한 연산을 추상화시켜 줄 뿐만 아니라 재사용을 가능케 하는 요소이기
machineboy0.tistory.com
REVIEW
와우 분명 저번에 상쾌한 풀이를 공부했던 터였는데
애너그램? 오 익숙한데 하면서 또 노가다 풀이로 구현했다.
머리 좋게 정렬해서 같은지를 살피면 되는.. 문제다.
다만 소문자와 대문자를 같게 판단해야 하는 부분이 이전에 풀었던 문제보다 업그레이드 된 부분인데
요기는 좀 더 아이디어가 있는지 모범 풀이 살펴보고 돌아오겠다.
CODE
// 아이디어 1
using System;
using System.Collections.Generic;
public class Anagram
{
private string baseWord;
public Anagram(string baseWord)
{
this.baseWord = baseWord; // baseWord를 대소문자 구분 없이 저장
}
// 같은 글자로 이루어져 있는지 체크하는 메서드
public string[] FindAnagrams(string[] potentialMatches)
{
List<string> answer = new List<string>();
foreach (string a in potentialMatches)
{
// 길이가 다르면 애초에 anagram이 아님
if (a.Length != this.baseWord.Length) continue;
if (a == this.baseWord) continue;
string temp = this.baseWord.ToLower(); // 이미 baseWord는 소문자로 저장되어 있음
if (a == temp) continue;
string A = a.ToLower(); // a를 소문자로 변환
if (A == temp) continue;
if (A == this.baseWord) continue;
foreach (char c in A)
{
// temp에서 문자를 찾고 제거하기
int index = temp.IndexOf(c);
if (index >= 0)
{
temp = temp.Remove(index, 1); // 해당 문자 제거
}
else
{
// temp에 문자가 없다면 break
break;
}
}
// temp가 비어있으면 완벽한 anagram
if (temp.Length == 0) answer.Add(a);
}
return answer.ToArray();
}
}
// 아이디어 2
using System;
using System.Collections.Generic;
public class Anagram
{
private string baseWord;
public Anagram(string baseWord)
{
this.baseWord = baseWord.ToLower(); // baseWord를 대소문자 구분 없이 저장
}
// 문자열을 알파벳 순으로 정렬하는 메서드
private string Sort(string word)
{
char[] characters = word.ToLower().ToCharArray(); // 대소문자 구분 없이 처리
Array.Sort(characters);
return new string(characters);
}
public string[] FindAnagrams(string[] potentialMatches)
{
List<string> answer = new List<string>();
foreach (string a in potentialMatches)
{
// 길이가 다르면 애초에 anagram이 아님
if (a.Length != this.baseWord.Length) continue;
// baseWord와 동일한 단어는 애너그램으로 간주하지 않음
if (a.ToLower() == this.baseWord) continue;
// 알파벳 순으로 정렬하여 비교
if (Sort(a) == Sort(this.baseWord))
{
answer.Add(a);
}
}
return answer.ToArray();
}
}
'Computer > Coding Test' 카테고리의 다른 글
Excercism - Secret Handshake 2진수 변환, 비트연산자(&,>>) (0) | 2025.02.05 |
---|---|
Excercism - Robot Name : Random, 중복체크, 아스키코드 (0) | 2025.02.04 |
Excercism - Beer Song : 문자열 개행 (0) | 2025.01.24 |
Excercism - Rail Fence Cipher : 지그재그, 1,-1 방향 조절 (0) | 2025.01.23 |
Excercism - CryptoSquare : 문자열 ✅ (0) | 2025.01.22 |