프로그래머스 - 비밀지도
https://school.programmers.co.kr/learn/courses/30/lessons/17681
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
내 코드
코드 통과가 되었다고 좋아했는데 좋은 코드가 아니라는것은 인식하고 있었다.
func solution(_ n:Int, _ arr1:[Int], _ arr2:[Int]) -> [String] {
var arr1String: [String] = []
var arr2String: [String] = []
for number in 0..<n {
arr1String.append(String(Int(arr1[number]), radix: 2))
arr2String.append(String(Int(arr2[number]), radix: 2))
}
var result: [String] = []
for i in 0..<n {
var string1 = Array(arr1String[i])
var string2 = Array(arr2String[i])
var number1 = n - string1.count
var number2 = n - string2.count
if number1 != 0 {
for _ in 0..<number1 {
string1 = "0"+string1
}
}
if number2 != 0 {
for _ in 0..<number2 {
string2 = "0"+string2
}
}
var resultString = ""
for i in 0..<n {
if string1[i] == "1" || string2[i] == "1" {
resultString += "#"
}else {
resultString += " "
}
}
result.append(resultString)
}
return result
}
2중 포문도 들어가있고, 1과 2 똑같은 절차를 진행하다보니 코드가 길어졌다.
다른사람의 코드
대단합니다.
func solution1(_ n:Int, _ arr1:[Int], _ arr2:[Int]) -> [String] {
var answer: [String] = []
for i in 0..<n {
var bitwise = String(arr1[i] | arr2[i], radix: 2)
bitwise = String(repeating: "0", count: n-bitwise.count) + bitwise
answer += [bitwise.reduce("", { $0 + ($1 == "1" ? "#" : " ") })]
}
return answer
}
코드 분석
1. Int와 Int의 or연산을 이용하여 2진수로 만드는코드
String(arr1[i] | arr2[i], radix: 2)
이론으로는 많이 봐왔지만 정작 써본적이 없었던 OR연산.
문제를 읽으면서 OR연산이라고 느끼긴 했지만 막상 어떻게 사용해야 할 지 몰라서 for문을 돌며 1이거나 || 1이면 "#"라고 입력했었는데,
이런 간단한 방법이 있다니.
다음엔 꼭 써먹고 말테다
2. 문자의 길이를 맞춰주기 위한 코드(일정 길이보다 작을시 앞에 0을 채워줌)
String(repeating: "0", count: n-bitwise.count)
이것도 String의 repeating, count를 생각하지 못했다.
사실 repeating,count는 2차원 배열을 생성할때 사용했었던 Array에만 존재하는 줄 알았다.
이 과정을 코딩할때도 반복문을 돌렸는데
이 방법 또한 유용하게 사용할 수 있을것 같다.
3. reduce를 사용한 코드
answer += [bitwise.reduce("", { $0 + ($1 == "1" ? "#" : " ") })]
reduce의 $0(첫번째 파라미터)는 result
reduce의 $1(두번째 파라미터)는 element
내 코드는 or을 사용하여 1이 있다면 #을 또!!! 반복문 돌렸는데
reduce를 이용하여 이렇게 간단하게 식을 만들 수 있다.
알고리즘 문제를 준비하면서 다른 고차함수들은 사용해 보았어도 reduce는 사용해보지 않았던거 같은데,
신경써서 몇번 써봐야 손에 잘 익을 것 같다.
저번에 익였던 진수 변환(radix)을 사용하고 테스트에 통과되어서 뿌듯 그 자체였지만,
역시 통과로 끝내기 보단 다른사람의 코드와 비교를 하는것이
실력에 있어서 많은 도움이 되는것 같다.
오늘도 즐코딩
'백준' 카테고리의 다른 글
| 숨바꼭질 2 (0) | 2023.12.24 |
|---|---|
| 그래프 BFS DFS (1) | 2023.11.19 |
| 연속되는 문자에 관한 문제 풀이 (0) | 2023.11.11 |
| [Swift] 진법 변환 radix (0) | 2023.11.11 |
| 백준 스위프트 2108 통계학 (0) | 2023.01.10 |