Tag - Ruby

25~32/67
  • 셀프 넘버 (4673)

    2023-02-04 12:10:00 굳이 함수를 만들 필요가 없는 문제지만.. 함수 문제니 만들어야지.. Bash f_sum() { local s=$1 local i=0 for ((i=0; i<${#1}; i++)); do s=$((s + ${1:$i:1})) done echo $s } arr=({1..10000}) for i in {1..10000}; do s=`f_sum $i` idx=-1 for ((j=0; j<${#arr[@]}; j++)); do if [ ${arr[$j]} == $s ]; then idx=$j break fi done if [ $idx != -1 ]; then arr=(${arr[@]::$idx} ${arr[@]:$idx+1}) fi done for x in ${arr[@]}; do echo $x done Bash에서 함수는 사용법, 파라미터 받는 법 등 모든 게 명령어와 똑같이 사용된다. 즉, Bash는 함수에서도 return을 종료코드로 사용하기 때문에 이를 사용하여 문자열을 리턴할 수 없다. 물론 숫자를 리턴해서 $?로 값을 받으면 되긴 하지만 0은 정상적인 종료, 그 외는 비정상적인 종료를 의미하기 때문에 사용하지 않는 것이 좋다. 대신 함수 내에서 리턴하고 싶은 문자열을 출력하고 그 값을 받으면 된다. 다른 언어들과 달리 Bash는 함수 내에서 변수를 선언하면 기본적으로 전역변수로 선언된다. 지역변수로 선언하려면 local 명령어를 사용하면 된다. (e.g. local var=val) 하지만… 이 문제는 시간이 굉장히 오래 걸려서 시간 초과가 뜬다. C #include <stdio.h> int f_sum(int n) { int s = n; while (0 < n) { s += n%10; n /= 10; } return s; } int main(void) { int arr[10000] = {0,}; for (int i=1; i<=10000; i++) { int s = f_sum(i); if (s <= 10000) { arr[s-1] = 1; } } for (int i=0; i<10000; i++) { if (arr[i] != 1) { printf("%d\n", i+1); } } return 0; } Node.js const f_sum = function(n) { let s = n; for (let m of n+"") { s += m*1; } return s; } let arr = []; for (let i=1; i<=10000; i++) { arr.push(i); } for (let i=1; i<=10000; i++) { let s = f_sum(i); let idx = arr.indexOf(s); if (idx != -1) { arr.splice(idx, 1); } } console.log(arr.join("\n")); PHP <?php function f_sum($n) { $s = $n; while (0 < $n) { $s += $n%10; $n = floor($n/10); } return $s; } $arr = range(1, 10000); foreach (range(1, 10000) as $x) { $s = f_sum($x); $idx = array_search($s, $arr); if ($idx != "") { unset($arr[$idx]); } } echo join("\n", $arr); ?> Python3 def f_sum(n): s = n for m in str(n): s += int(m) return s arr = [i for i in range(1, 10001)] for i in range(1, 10001): s = f_sum(i) if s in arr: arr.remove(s) print("\n".join(map(str, arr))) Ruby def f_sum(n) s = n for m in n.to_s.split("") s += m.to_i end return s end arr = Array(1..10000) for i in 1..10000 s = f_sum(i) arr.delete_at(arr.index(s)) if arr.index(s) end puts arr
  • 평균은 넘겠지 (4344)

    2023-02-02 22:28:00 이건 출제자가 너무했다.. Bash read c for ((i=0; i<c; i++)); do read arr n=${arr::1} arr=(${arr#* }) sum=0 for g in ${arr[@]}; do sum=$((sum + g)) done avg=$((sum*10 / n)) cnt=0 for g in ${arr[@]}; do if [ $avg -lt $((g * 10)) ]; then cnt=$((cnt + 1)) fi done p=$((cnt*1000000 / n)) e=${p:${#p}-1} p=${p%$e*} p=$((5 <= e ? p+1 : p)) n=${p:: -3} echo $n1.${p#$n}% done 정답과 똑같이 나오는데 백준에서는 런타임 에러가 든다. C #include <stdio.h> int main(void) { int c, n, cnt; float sum, avg; scanf("%d", &c); for (int i=0; i<c; i++) { scanf("%d", &n); int arr[n]; for (int j=0; j<n; j++) { scanf("%d", &arr[j]); } sum = 0; for (int j=0; j<n; j++) { sum += arr[j]; } avg = sum / n; cnt = 0; for (int j=0; j<n; j++) { cnt += avg < arr[j] ? 1 : 0; } printf("%.3f%%\n", (double)cnt/n*100); } return 0; } Node.js let [c, ...input] = require("fs").readFileSync(0).toString().trim().split("\n"); for (let arr of input) { [n, ...arr] = arr.split(" ").map(Number); let avg = arr.reduce((r, x, i) => { return r + x }) / n; cnt = 0; for (let g of arr) { if (avg < g) cnt++ } p = Math.round(cnt/n*100*1000) / 1000; console.log(`${p.toFixed(3)}%`); } JavaScript의 round()는 소수점 지정이 안되기 때문에 1000을 곱하고 다시 나눈다. PHP <?php fscanf(STDIN, "%d", $n); for ($i=0; $i<$n; $i++) { $arr = explode(" ", trim(fgets(STDIN))); $m = $arr[0]; $arr = array_slice($arr, 1); $avg = array_sum($arr)/$m; $cnt = 0; foreach ($arr as $x) { if ($avg < $x) { $cnt++; } } echo sprintf("%.3f", ($cnt/$m*100))."%\n"; } ?> Python3 c = int(input()) for i in range(c): arr = list(map(int, input().split())) n, arr = arr[0], arr[1:] avg = sum(arr)/n cnt = 0 for g in arr: if avg < g: cnt += 1 p = "{:.3f}%".format(cnt/n*100) print(p) Ruby c = gets.chomp.to_i for i in 0...c arr = gets.chomp.split().map {|i| i.to_i} n, arr = arr[0].to_f, arr.slice(1, arr.size-1) avg = arr.sum()/n cnt = 0 for g in arr cnt += 1 if avg < g end p = "%.3f" % (cnt/n*100) + "%" puts p end
  • OX퀴즈 (8958)

    2023-02-02 21:30:00 한 게임당 얻을 수 있는 최대 점수는? Bash read n for ((i=0; i<n; i++)); do read oxs g=0 sum=0 for ((j=0; j<${#oxs}; j++)); do [ "${oxs:$j:1}" == "O" ] && g=$((g + 1)) || g=0 sum=$((sum + g)) done echo $sum done C #include <stdio.h> #include <string.h> int main(void) { int n, g, sum; scanf("%d", &n); for (int i=0; i<n; i++) { sum = 0; char input[n+1]; scanf("%s", input); for (int j=0; j<strlen(input); j++) { g = input[j] == 'O' ? g + 1 : 0; sum += g; } printf("%d\n", sum); } return 0; } Node.js let [n, ...input] = require("fs").readFileSync(0).toString().trim().split("\n"); for (let oxs of input) { let g = 0; let sum = 0; for (let ox of oxs.split("")) { let g = ox == "O" ? g + 1 : 0 sum += g; } console.log(sum); } PHP <?php fscanf(STDIN, "%d", $n); for ($i=0; $i<$n; $i++) { $g = 0; $sum = 0; $oxs = trim(fgets(STDIN)); for ($j=0; $j<strlen($oxs); $j++) { $g = $oxs[$j] == "O" ? $g+1 : 0; $sum += $g; } echo $sum."\n"; } ?> Python3 n = int(input()) for i in range(n): oxs = input() arr = [0] for ox in oxs: g = arr[-1] + 1 if ox == "O" else 0 arr.append(g) print(sum(arr)) Ruby n = gets.chomp.to_i for i in 0...n oxs = gets.chomp.split("") arr = [0] for ox in oxs g = ox == "O" ? arr[-1] + 1 : 0 arr.push(g) end puts arr.sum() end Updated 1차원 배열의 8번 문제였으나 제외되었다.
  • 평균 (1546)

    2023-02-01 22:10:00 점수 조작은 나빠요..! Bash read n read -a arr max=$arr for ((i=1; i<n; i++)); do max=$((max < arr[i] ? arr[i] : max)) done total=0 for ((i=0; i<n; i++)); do total=$((total + arr[$i]*100 * 100 / $max)) arr[$i]=$((arr[$i]*100 * 100 / $max)) done avg=$((total / n)) n=${avg:: -2} echo $n.${avg#$n} 100을 한 번 더 곱한 이유는 Bash는 소수점 계산이 안되기 때문에. 같은 이유로 최댓값으로 나누기 전에 100을 먼저 곱해야 한다. C #include <stdio.h> int main(void) { int n, m, max = 0; scanf("%d", &n); float arr[n], total = 0; for (int i=0; i<n; i++) { scanf("%d", &m); arr[i] = m; max = max < m ? m : max; } for (int i=0; i<n; i++) { total += arr[i] / max * 100; } printf("%f\n", total/n); return 0; } Node.js let [n, ...arr] = require("fs").readFileSync(0).toString().trim().split(/ |\n/).map(Number); let max = Math.max(...arr); let total = arr.reduce((r, x, i) => { return r + x / max * 100; }); console.log(total / n); PHP <?php fscanf(STDIN, "%d", $n); $arr = explode(" ", trim(fgets(STDIN))); $max = max($arr); for ($i=0; $i<$n; $i++) { $arr[$i] = $arr[$i] / $max * 100; } echo array_sum($arr)/$n; ?> Python3 n = int(input()) arr = list(map(int, input().split())) m = max(arr) for i in range(n): arr[i] = arr[i] / m * 100 print( sum(arr)/n ) Ruby n = gets.chomp.to_i arr = gets.chomp.split().map {|i| i.to_f} max = arr.max() puts arr.map {|i| i / max * 100}.sum() / n 제일 짧은데 제일 오래 걸린다..
  • 나머지 (3052)

    2023-02-01 21:30:00 42로 나눴을 때 나올 수 있는 나머지의 수 Bash arr=() for i in {1..10}; do read n n=$((n % 42)) if ! [[ " ${arr[@]} " =~ " $n " ]]; then arr+=($n) fi done echo ${#arr[@]} arr+=($n) == 배열 마지막에 원소 추가 C #include <stdio.h> int main(void) { int arr[42] = {0,}; int n; for (int i=0; i<10; i++) { scanf("%d", &n); arr[n%42]++; } n = 0; for (int i=0; i<42; i++) { if (arr[i] != 0) { n++; } } printf("%d\n", n); return 0; } Node.js let arr = require("fs").readFileSync(0).toString().trim().split("\n").map(x => Number(x) % 42); arr = [...new Set(arr)]; console.log( arr.length ); 중복 값 제거 PHP <?php $arr = []; for ($i=0; $i<10; $i++) { fscanf(STDIN, "%d", $n); $v = $n % 42; if (array_search($v, $arr) == "") { array_push($arr, $v); } } echo count($arr); ?> Python3 arr = [] for i in range(10): n = int(input()) % 42 if n not in arr: arr.append(n) print(len(arr)) Ruby arr = [] for i in 1..10 n = gets.chomp.to_i % 42 if not arr.include?(n) arr.push(n) end end puts arr.size
  • 과제 안 내신 분..? (5597)

    2023-01-31 22:36:00 1부터 30중에 빠진 숫자를 찾아라! 1부터 30까지의 문자열을 미리 준비해놓고 입력한 수를 제거한다. 1부터 30까지 반복문을 돌리며 미리 입력받은 값에 해당 수가 있는지 체크한다. Bash arr=" `echo {1..30}` " for i in {1..28}; do read n arr=${arr/ $n / } done arr=${arr# } echo "${arr/ /$'\n'}" C #include <stdio.h> int main(void) { int arr[28]; for (int i=0; i<28; i++) { scanf("%d", &arr[i]); } int idx; for (int n=1; n<=30; n++) { idx = -1; for (int i=0; i<28; i++) { if (arr[i] == n) { idx = i; break; } } if (idx == -1) { printf("%d\n", n); } } return 0; } Node.js let arr = [...Array(30).keys()].map(x => x + 1); let input = require("fs").readFileSync(0).toString().trim().split("\n").map(Number).sort(); for (let n of input) { arr.splice(arr.indexOf(n), 1); } console.log(arr.join("\n")); PHP <?php $arr = range(1, 30); for ($i=0; $i<28; $i++) { fscanf(STDIN, "%d", $n); $idx = array_search($n, $arr); unset($arr[$idx]); } echo join("\n", $arr); ?> Python3 arr = [i for i in range(1, 31)] for i in range(28): n = int(input()) arr.remove(n) print( "\n".join(map(str, arr)) ) Ruby arr = Array(1..30) for i in 0...28 n = gets.chomp.to_i arr.delete_at(arr.index(n)) end puts arr
  • 최댓값 (2562)

    2023-01-31 22:13:00 최댓값은 어디에 있을까? Bash arr=(0 0) for i in {1..9}; do read n if [ ${arr[0]} -lt $n ]; then arr[0]=$n arr[1]=$i fi done echo $arr echo ${arr[1]} Bash는 배열에서 인덱스를 지정하지 않으면 첫 번째 원소가 사용된다. C #include <stdio.h> int main(void) { int n; int arr[2] = {0, 0}; for (int i=0; i<9; i++) { scanf("%d", &n); if (arr[0] < n) { arr[0] = n; arr[1] = i+1; } } printf("%d %d\n", arr[0], arr[1]); return 0; } Node.js let [...arr] = require("fs").readFileSync(0).toString().trim().split("\n").map(Number); let max = Math.max(...arr); console.log( max, arr.indexOf(max)+1 ); PHP <?php $arr = []; for ($i=0; $i<9; $i++) { fscanf(STDIN, "%d", $n); array_push($arr, $n); } $max = max($arr); echo $max."\n"; echo array_search($max, $arr)+1; ?> Python3 arr = [] for i in range(9): arr.append(int(input())) m = max(arr) print(m, arr.index(m)+1) Ruby arr = [] for i in 0...9 arr[i] = gets.chomp.to_i end max = arr.max() puts "#{max} #{(arr.index max) + 1}"
  • 최소, 최대 (10818)

    2023-01-30 22:33:00 최솟값과 최댓값 Bash read n read arr # # arr=(`echo $arr | tr " " "\n" | sort -n`) # arr=(`echo "${arr// /$'\n'}" | sort -n`) # echo "$arr ${arr[${#arr[@]}-1]}" arr2=(${arr%% *} 0) for i in $arr; do if [ $i -lt ${arr2[0]} ]; then arr2[0]=$i; fi if [ $i -gt ${arr2[1]} ]; then arr2[1]=$i; fi done echo ${arr2[@]} tr, sort도 안된다.. 그냥 문제 푸는데 필요한 명령어 외에는 다 안되는 듯하다. 그래서 반복문을 돌려야 하는데 죄다 시간 초과가 걸린다.. 결론은 위 두 방법 다 답은 나오지만 백준에서는 되지 않는다. C #include <stdio.h> int main(void) { int n, m; scanf("%d", &n); int arr[2] = {0, 0}; for (int i=0; i<n; i++) { scanf("%d", &m); if (i == 0) { arr[0] = m; arr[1] = m; } else if (m < arr[0]) { arr[0] = m; } else if (arr[1] < m) { arr[1] = m; } } printf("%d %d\n", arr[0], arr[1]); return 0; } Node.js let [n, ...arr] = require("fs").readFileSync(0).toString().trim().split(/ |\n/).map(Number); console.log( Math.min(...arr), Math.max(...arr) ) PHP <?php fscanf(STDIN, "%d", $n); $arr = explode(" ", trim(fgets(STDIN))); echo min($arr)." ".max($arr); ?> Python3 n = int(input()) arr = sorted(map(int, input().split())) print(arr[0], arr[-1]) 오름차순 정렬 후 첫 번째와 마지막 원소를 출력. Ruby n = gets.chomp.to_i arr = gets.chomp.split().map {|i| i.to_i} puts "#{arr.min()} #{arr.max()}"