이번에는 금방 푼 거 같은데 시간 초과 해결하느라 시간이 좀 걸렸다. 찾아보니 시간 초과 때문에 통과 못 하신 분들이 많은 것 같은데 문제 특성상 반복문을 사용하는 방식을 쉽게 떠올리게 되어 있어서 그런 듯하다. 근데 javascript를 쓰는 경우에는 map, reduce를 활용하라고 대놓고 낸 문제인 것 같다. 문제 보자마자 빤히 보이길래 알고 있었는데도 애써 무시하고 3중첩 for문 돌렸다가 코드를 거의 다시 짜야했다. (map, reduce가 아직 낯설어서 쓰기 싫었음)
시간초과 실패 코드
/* 1. 캐릭별 신고 받은 횟수 카운트하고
2. 신고받은 횟수가 k 이상인 경우
3. 신고자에게 +1
(같은 유저가 같은 유저 여러 번 신고해도 1번만 카운트)
*/
function solution(id_list, report, k) {
var answer = [];
var blist = []; // 신고 당한 유저
var cnt = []; // 신고 당한 횟수
report = [...new Set(report)]; // 같은 유저가 같은 유저 신고 카운트 1번만 되도록 중복 제거
answer = new Array(id_list.length).fill(0);
for (let i=0; i < report.length; i++) {
blist.push(report[i].split(" ",2)[1]);
}
cnt = blist.reduce((arr, cur) => {
arr[cur] = (arr[cur] || 0)+1;
return arr;
}, {});
for (let j=0; j < (Object.keys(cnt)).length; j++) {
if (Object.values(cnt)[j] >= k) { // 신고 횟수가 이상이면
for(let m=0; m < report.length; m++) {
if (Object.keys(cnt)[j] == report[m].split(" ",2)[1]) { // 신고당한 유저
for(let n=0; n < id_list.length; n++) {
if (id_list[n] == report[m].split(" ",2)[0]) { // 신고한 유저
answer[n] += 1;
}
}
}
}
}
}
return answer;
}
정답코드를 보고나니 for문 쓰는 건 확실히 괜히 복잡해지고 좋은 코드는 아니다.
위의 코드가 평소 내가 짜던 스타일인데 내 코드는 뭔가 전부터 느꼈지만 아는 거에서 어떻게든 돌리려는 느낌이 강한, 좀 고집있는..? 스타일인 거 같다.
고쳐야 되는 스타일이긴 하다...
두 번째 문제 푼 건데 벌써 코딩 테스트가 꽤 도움이 되는 것 같다고 느끼고 있다.
역시 카카오 코테는 좀 어렵지만 왜 코테보는 지 알 거 같기도 하다.
시간 초과 실패라는 걸 알았을 때부터는 map을 써서 어떻게든 for문 하나만 빼보자, 라는 생각으로 머리를 굴렸다.
근데 map을 써도 for문이 줄어들 수 있는 코드는 도저히 생각이 안나서 아래 코드를 참고했다.
<?php
namespace Config;
use CodeIgniter\Database\Config;
/**
* Database Configuration
*/
class Database extends Config
{
/**
* The directory that holds the Migrations
* and Seeds directories.
*
* @var string
*/
public $filesPath = APPPATH . 'Database' . DIRECTORY_SEPARATOR;
/**
* Lets you choose which connection group to
* use if no other is specified.
*
* @var string
*/
public $defaultGroup = 'default';
/**
* The default database connection.
*
* @var array
*/
public $default = [
'DSN' => '',
'hostname' => 'localhost',
'username' => 'DBMS 유저명',
'password' => 'DBMS 비밀번호',
'database' => 'DB 명',
'DBDriver' => 'MySQLi',
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'charset' => 'utf8',
'DBCollat' => 'utf8_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => 3307, // 기본포트는 3306이나 저의 경우 다른 DB가 해당 포트를 사용중이므로 3307로 지정했습니다.
];
/**
* This database connection is used when
* running PHPUnit database tests.
*
* @var array
*/
public $tests = [
'DSN' => '',
'hostname' => '127.0.0.1',
'username' => '',
'password' => '',
'database' => ':memory:',
'DBDriver' => 'SQLite3',
'DBPrefix' => 'db_', // Needed to ensure we're working correctly with prefixes live. DO NOT REMOVE FOR CI DEVS
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'charset' => 'utf8',
'DBCollat' => 'utf8_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => 3306,
];
public function __construct()
{
parent::__construct();
// Ensure that we always set the database group to 'tests' if
// we are currently running an automated test suite, so that
// we don't overwrite live data on accident.
if (ENVIRONMENT === 'testing') {
$this->defaultGroup = 'tests';
}
}
}
다른 건 건드릴 필요 없었고 default에 한글로 기재해 놓은 부분만 수정하면 됩니다.
App/Controllers/Home.php
<?php
namespace App\Controllers;
use App\Models\sample_model;
class Home extends BaseController
{
/* public function __construct(){
// parent::__construct(); // BaseController 상속 받을 때는 이 코드 사용 안함!
$this->load->model('show_db'); // ci3 버전 모델 로드 코드
} */
public function index()
{
$sampleModel = model(sample_model::class);
$db = \Config\Database::connect();
$builder = $db->table('cidb');
$query = $builder->get(); // Produces: SELECT * FROM mytable
foreach ($query->getResult() as $row) {
echo $row->id, "\n";
echo $row->title;
}
return view('show_db'); // App/Views/show_db.php
}
}