Today I Learned

백준 swift - 문자열

돌맹이시터 2021. 10. 21. 21:53

11654 아스키코드, 11720 숫자의 합, 10809 알파벳 찾기, 2675 문자열 반복, 1157 단어 공부, 1152 단어의 개수, 2908 상수, 5622 다이얼, 2941 크로아티아 알파벳, 1316 그룹 단어 체커

 


 

11654 아스키코드

 

// 11654 아스키 코드
var input = readLine()!
print(Character(input).asciiValue!)

// 11654 아스키 코드
var input = Character(readLine()!)
print(input.asciiValue!)

 

두 가지 경우로 작성해봤는데,

워낙 코드가 짧아서인지 시간이나 메모리에서 아무런 차이가 없었다.

 

 


 

11720 숫자의 합

 

 

//11720 숫자의 합
var count = Int(readLine()!)!
var num = readLine()!.map{Int(String($0))!}
print(num.reduce(0,+))

 

첫째 줄에 입력받는 숫자의 개수를 쓰지 않았고

다른 사람들이 제출한 것과 코드 길이나 방식이 많이 달라서

뭔가...

출제의도에 맞게 풀지 못했나 자괴감이 들고 괴로워.....

하지만 아무런 이상은 없는 것 아닌가..... 싶기도 하고.....

그냥...네.....

 

 

 


10809 알파벳 찾기

 

 

// 10809 알파벳 찾기
var input = readLine()!.map{Int(Character(String($0)).asciiValue!)}
for j in 97...122 {
	if input.contains(j) {
		print(input.firstIndex(of:j)!, terminator: " ")
	} else {
		print(-1, terminator: " ")
	}
}

 

쉬운듯 어려운듯 했던 문제

 

 


 

 

2675 문자열 반복

 

 

// 2675 문자열 반복
let caseNum = Int(readLine()!)!
for i in 1...caseNum {
	var input = readLine()!.split(separator: " ").map{String($0)}
	var string = Array(input[1])
	for j in 0..<string.count {
		for k in 1...Int(input[0])! {
			print(string[j], terminator: "")
		}
	}
	print("")
}

 

for문 3개로 코드 작성 완료!

 

 

 


 

 

 

1157 단어 공부

 

2가지 코드 작성

 

// 1157 단어 공부 -1 (180ms,373B)
let input = readLine()!.uppercased()
var dict : [String:Int] = [:]

input.forEach {
	if dict[String($0)] == nil {
		dict[String($0)] = 1
	} else {
		dict[String($0)]! += 1
	}
}

var result : [String] = []
for key in dict.keys {
	if dict[key] == dict.values.max()! {
		result.append(key)
	}
}
result.count > 1 ? print("?") : print(result[0])

 

첫 번째 코드 - 시간이 두 배 이상 걸렸음.

 

입력값을 모두 대문자로 변환한 다음, 

각각의 값이 딕셔너리에 없으면 해당 알파벳에 해당하는 키 값의 밸류에 +1

딕셔너리의 모든 밸류의 값 중 가장 큰 값에 해당하는 키 값(알파벳)을 result 배열에 넣음

result를 카운트해서 2 이상이면 물음표를 출력, 카운트가 1이라면 해당 값을 출력

 

 

// 1157 단어 공부 -2 (72ms, 362B)
let input = readLine()!.uppercased()
var count : [Int] = Array(repeating: 0, count: 26)
input.forEach {	count[Int($0.asciiValue!) - 65] += 1 }

var maxCount = count.max()!

let firstIndex = count.firstIndex(of: maxCount)!
let lastIndex = count.lastIndex(of: maxCount)!

if firstIndex == lastIndex {
	print(UnicodeScalar(65 + firstIndex)!)
} else {
	print("?")
}

 

두 번째 코드 - 코드의 길이도 짧아지고, 시간도 단축됨

 

입력값을 모두 대문자로 변환한 다음,

알파벳의 개수(26개)만큼의 '0'를 넣은 count 배열을 하나 만듬

입력값을 하나씩 count 배열에서 '각각의 입력값의 아스키코드값-65' (알파벳 대문자의 아스키코드는 65부터 시작하기 때문) 에 해당하는 인덱스 값에 +1 해줌

맥스카운트라는 변수를 count배열의 맥스값으로 리턴

카운트에 있는 최대값 (가장 많은 알파벳)이 여러 개일 경우 물음표를 출력해주기 위해 나머지 코드 작성

 

 

 

 

1152 단어의 개수

 

// 1152 단어의 개수
let input = readLine()!.split(separator: " ")
print(input.count)

ㅎㅎ....;;

 

 

 

 

2908 상수

 

두 가지 코드로 작성, 코드가 짧아서 그런지 동일한 시간이 걸림

 

// 2908 상수 -1 (손코딩)
var input = readLine()!.split(separator: " ").map{Int($0)!}

for i in 0...1 {
	let a = input[i] / 100
	let b = (input[i] - (a*100)) / 10
	let c = input[i] % 10
	input[i] = c*100 + b*10 + a
}
print(input.max()!)

 

첫 번째 코드 - 숫자를 뒤집기 위해 열심히.. for문 작성 후 출력

 

 

// 2908 상수 -2 (swift 참맛)
let input = readLine()!.split(separator: " ")
let num1 = Int(String(input[0].reversed()))!
let num2 = Int(String(input[1].reversed()))!

print(num1>num2 ? num1 : num2)

 

두 번째 코드 

swift의 reversed()를 사용해 위의 코드보다 간략하게 작성됨

 

 

 

 

 

5622 다이얼

 

// 5622 다이얼
var input = readLine()!.map{Character(String($0))}
var result = 0

for i in input {
	switch i {
	case "A", "B", "C" :
        result += 3
	case "D", "E", "F" :
    	result += 4
    case "G", "H", "I" :
        result += 5
    case "J", "K", "L" :
        result += 6
    case "M", "N", "O" :
        result += 7
    case "P", "Q", "R", "S" :
        result += 8
    case "T", "U", "V" :
        result += 9
	default :
		result += 10
	}
}
print(result)

 

switch, case 사용

덧셈만 해줌~

 

 

 

 

2941 크로아티아 알파벳

 

두 가지 코드를 작성...하려다 포기

 

// 2941 크로아티아 알파벳 -1 replacingOccurrences / 24ms / 79160KB
import Foundation
var input = readLine()!
let croChar = ["c=","c-","dz=","d-","lj","nj","s=","z="]

for i in 0 ..< croChar.count {
	input = input.replacingOccurrences(of:croChar[i], with:"k")
}
print(input.count)

 

꽤나 많은 시간이 걸림.

import Foundation

.replacingOccurrences(of: , with: )

을 사용하여 문자열을 치환함

입력받은 문자열 중 croChar으로 지정한 특정한 문자열이 있다면 다른 문자로 치환시킴

이 코드의 경우 "k"로 치환하였지만, 어떤 값을 입력해도 상관없다. (단, 글자 수를 세야 하기 때문에 한 글자여야 함)

 

 

 

 

 

1316 그룹 단어 체커

 

 

// 1316 그룹단어 체커
let count = Int(readLine()!)!
var groupNum = 0
for _ in 1...count {
	let inputWord = readLine()!.map{Character(String($0))}
	var verify:[Character] = []
	for i in 0..<inputWord.count {
		if i == 0 {
			verify.append(inputWord[i])
		} else {
			if inputWord[i-1] != inputWord[i] && verify.firstIndex(of: inputWord[i]) != nil {
				break
			} else {
				verify.append(inputWord[i])
			}
		}
	}
	if verify.count == inputWord.count {
		groupNum += 1
	}
}
print(groupNum)

 

입력받은 단어들 중 그룹단어가 몇 개인지 알아내기 위해 groupNum 이라는 변수를 생성

 

입력값을 문자 단위로 배열로 만들고,

새로운 Character 배열 verify을 만듬

입력값을 하나씩 비교해가며 verify 배열에 넣을 건데,

바로 앞의 인덱스에 해당하는 값과 지금 인덱스 값이 서로 다르면서, 지금 인덱스 값이 verify 배열 안에 이미 있다면

그룹단어가 아니므로 break

verify와 입력값의 count가 같다면 groupNum += 1