백준 10809번 - 알파벳 찾기

이설군·2022년 6월 20일
0

백준

목록 보기
23/52

문제

알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.

출력

각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다.

만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출력한다. 단어의 첫 번째 글자는 0번째 위치이고, 두 번째 글자는 1번째 위치이다.

예제 입력 1

baekjoon

예제 출력 1

1 0 -1 -1 2 -1 -1 -1 -1 4 3 -1 -1 7 5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

let s = "baekjoon"
var abc = [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]
for i in s {
    print(i=="a" ?i=="b" ?i=="c" ?i=="d" ?i=="e" ?i=="f" ?i=="g" ?i=="h" ?i=="i" ?i=="j" ?i=="k" ?i=="l" ?i=="m" ?i=="n" ?i=="o" ?i=="p" ?i=="q" ?i=="r" ?i=="s" ?i=="t" ?i=="u" ?i=="v" ?i=="w" ?i=="x" ?i=="y" ?i=="z" ?(abc[25]=0):(abc[25]=0):(abc[24]=0):(abc[23]=0):(abc[22]=0):(abc[21]=0):(abc[20]=0):(abc[19]=0):(abc[18]=0):(abc[17]=0):(abc[16]=0):(abc[15]=0):(abc[14]=0):(abc[13]=0):(abc[12]=0):(abc[11]=0):(abc[10]=0):(abc[9]=0):(abc[8]=0):(abc[7]=0):(abc[6]=0):(abc[5]=0):(abc[4]=0):(abc[3]=0):(abc[2]=0):(abc[1]=0):(abc[0]=0), terminator: " ")
}

이정도까지는 생각해봤다. 음..근데 문제가 등장하는 위치의 인덱스를 넣을 방법이...너무 노가다성이 짙어보인다.ㅋㅋㅋㅋ 지금도 노가다 인것같은데 ㅎㅎ;
거기다가 이렇게 될경우 처음 등장하는 위치가 아니라 마지막에 등장한 위치가 넣어져버린다.
다른 핸들링 방법이 있겠거니 싶어서 구글링 시작.

for i in Character("a").asciiValue!...Character("z").asciiValue! {}

아스키코드를 이용한 핸들링 방법!
if문을 이용해서 i가 s에 들어가 있는지 확인한후 맞다면 i가 들어가 있는 값의 인덱스의 자리를 프린트 아니라면 -1을 프린트
머리 펑!!!!!

좀더 잘 이해하기 위해 이전에 문제를 풀면서 잘정리해둔 블로그를 또 들어가보았다.
링크

firstIndex(of:), lastIndex(of:)를 사용하면 원하는 문자가 있는 인덱스를 구할 수 있다.
반환형은 String.Index? (옵셔널)이므로 Unwrapping 후 사용

let str = "Hello World"
if let index = str.firstIndex(of: "o") {
    print(index) // 4
}
if let index = str.lastIndex(of: "o") {
    print(index) // 7
}

특정 문자를 포함하고 있는 여부만 알고 싶다면 contains(_:)를 사용
결과값은 Bool 형이다.

let str = "Apple"
print(str.contains("A")) // true
print(str.contains("a")) // false

이두가지를 이용하여 문제에 도전하기로 했다 ㅎㅎ

제출

맞은 제출 1

let s = Array(readLine()!)
for i in Character("a").asciiValue!...Character("z").asciiValue! {
    let a = Character(UnicodeScalar(i))
    if s.contains(a) {
        print("\(s.firstIndex(of: a)!)", terminator: " ")
    }else {
        print("-1", terminator: " ")
    }
}

맞은 제출 2 (배운것 최대한 활용!)

let s = Array(readLine()!)
let a = Array("abcdefghijklmnopqrstuvwxyz")

for i in a {
	print(s.contains(i) ?(s.firstIndex(of: i)!):"-1", terminator: " ")
}

오답노트

틀린 제출 1

let s = readLine()!
for i in s {
	if str.contanis("\(i)") {
    	print(s.firstIndex(of: "\(i)"), terminator: " ")
    }else {
    	print("-1", terminator: " ")
    }
}

일단 이렇게 할경우 -1을 프린트할 부분이 없다. for문에 a...z를 넣거나 26을 넣고 노가다를 하거나. 앞에를 택해서 수정했다.

let s = readLine()!
for i in Character("a").asciiValue!...Character("z").asciiValue! {
    let a = Character(UnicodeScalar(i))
    if s.contains(a) {
        print("\(s.firstIndex(of: a)!)", terminator: " ")
    }else {
        print("-1", terminator: " ")
    }
}

제출했는데 틀렸다. 이렇게 할경우 s가 배열이 아니라 비트로 나온다. ㅎㅎ;
처음안 사실인데 Array(String)을 할경우 하나씩 들어가진다.대박...이거 알았으면 앞에 문제 몇개는 좀더 쉽게 풀수 있었을것같다.

숏코딩

숏코딩 예제 1

var r=readLine()!.map{$0.asciiValue!}
(97...122).map{print(r.firstIndex(of:$0) ?? -1)}

ㅋㅋㅋㅋ 아스키코드 값을 알고있어야 쓸수 있는 코드 ㅋㅋㅋㅋ

숏코딩 예제 2

let input = readLine()!
let str = "abcdefghijklmnopqrstuvwxyz"

for i in Array(str) {
    let a = input.map { $0 }.firstIndex(of: i) ?? -1
    print(a)
}

상상도 못한 숏코딩. 아스키코드로 바꾸지 않으묜 비교할수가 없는지가 제일 고난이었는데 그걸 해결했다! Array(String)을 할경우 배열로 바뀌니까..대박..

??을 아직 쓸줄 모르기에 배운것을 최대한 활용해서 맞은 제출 2에 쓴것처럼 제출했다. 매우 배움이 많았던 문제였다. 최고~!

profile
티끌 모아 태산. 내가 가는 길이 옳은 길이라 믿으며 최선을 다해 걷는다.

0개의 댓글