단어 공부 (백준 1157번)

썹스·2022년 8월 13일
0

문제

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

입력

첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.

출력

첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.


예제 입력 1

Mississipi

예제 출력 1

?

예제 입력 2

zZa

예제 출력 2

Z

예제 입력 3

z

예제 출력 3

Z

예제 입력 4

baaa

예제 출력 4

A


풀이 소스 코드

let word = readLine()!.map{Character(String($0).uppercased()).asciiValue! - 65}
var wordArr = [Int](repeating: 0, count: 26) 
var max = 0
var maxCount = 0

for i in word{
    wordArr[Int(i)] = wordArr[Int(i)] + 1
    
    if max < wordArr[Int(i)]{
        max = wordArr[Int(i)]
        maxCount = Int(i)
    }
}

let maxWordArrCount = wordArr.filter{$0 == wordArr.max()!}.count

if maxWordArrCount != 1{
    print("?")
}
else{
    print(UnicodeScalar(maxCount + 65)!)
}

  1. 입력받은 문자열의 값을 map{} 함수를 사용하여 문자로 찢는다 ->
    찢어놓은 문자를 uppercased() 함수를 사용하여 대문자로 통일 ->
    대문자로 통일된 문자값을 아스키코드값으로 변환하는 코드 asciiValue를 사용하여 사용
let word = readLine()!.map{Character(String($0).uppercased()).asciiValue! - 65}
  1. 알파벳 A~Z의 개수가 들어갈 수 있는 배열(26개의 방)을 0의 값으로 생성한다. ->
    for 문을 활용하여 알파벳의 개수를 배열에 저장 ->
    제일 많은 알파벳의 인덱스 번호를 maxCount에 저장
var wordArr = [Int](repeating: 0, count: 26)  // A~Z의 개수가 들어갈 공간
var max = 0  // 배열안의 최댓값
var maxCount = 0  // 최댓값의 인덱스값 = 방 번호

for i in word{
    wordArr[Int(i)] = wordArr[Int(i)] + 1  // 해당 알파벳이 등장할 때마다 1씩 증가
    
    if max < wordArr[Int(i)]{
        max = wordArr[Int(i)]
        maxCount = Int(i)  // 제일 많은 알파벳의 인덱스 번호를 추출
    }
}
  1. filter{} 함수를 활용하여 가장 많이 사용된 알파벳이 여러개 존재하는지 검사 ->
    많이 사용된 알파벳이 여러 개 존재하면 "?" 출력 ->
    그렇지 않으면 제일 많이 사용된 알파벳의 인덱스값을 65(A의 아스키코드값)와 더한 다음 UnicodeScalar 함수를 사용하여 문자값으로 변경
let maxWordArrCount = wordArr.filter{$0 == wordArr.max()!}.count

if maxWordArrCount != 1{
    print("?")
}
else{
    print(UnicodeScalar(maxCount + 65)!)
}

😞변수 이름 정하는 거 너무 어렵다... + 이렇게 푸는 거 맞나?? 풀이코 드가 너무 엉성한 거 같다...

profile
응애 나 코린이(비트코인X 코딩O)

0개의 댓글