매일 매일 하루 한 문제씩.
꾸준히 이어가는 코딩테스트 풀이 기록 ✅
오늘은 문제를 2개 풀었다. '3진법 뒤집기', '직사각형 별찍기'
두 문제 모두 어려운 문제는 아니었는데, 진법 문제는 매번 풀때마다 좀 헷갈리는 부분이 있어서 그걸 해결해내는데 조금 시간이 들었고.
직사각형 별찍기의 경우 아주 오랜만에 Scanner 함수를 보면서 갑자기 '...엥?' 하는 생각이 들면서 문제 자체를 파악하는데 시간을 들였다.
결론적으로 두 문제 다 풀긴 했는데, 특히 자바의 경우에는 중첩되는 메서드가 많아지면서 이게 맞는걸까? 하는 의문이 좀 들었고.
자바스크립트의 경우 정말 이번만큼은 for나 while을 사용하지 않을 수 있을까? 란 생각을 했었는데
toString() 메서드를 알면서 뭔가 희망 아닌 희망을...(ㅎㅎㅎㅎㅎ) 갖게 되었고 다행히 원하는 방향대로 풀 수 있었다.
말미에 toString()을 간략히 정리하고 자바스크립트 튜토리얼 링크도 함께 남겨두려 한다.
결국 자바에서 생각해낸 진법 전환은 해당 숫자로 반복 나누기를 진행하는 것이다.
진행하면서 발생하는 나머지를 누적시키는 방법으로 진행했는데 절차를 하나 더 줄이기 위해 3진법으로 전환 -> reverse 과정을 하나로 합쳐 아예 reverse 된 숫자를 문자열로 만드는 방식으로 진행했다.
예전에 이 문제를 풀었을 때는 char 타입의 변수를 int화 시키는 메서드를 찾느라 고생했는데, 이번에는 구글링을 하지 않고 char to int 뭐 이런식으로 계속 입력해보면서 찾다가 getNumericValue라는 것을 보고는 '이거다!' 싶어서 바로 사용했는데 원하는 방식이었다.
거듭제곱을 하는 것 역시 Math 함수에서 찾으면서 진행했고...
구글링을 하지 않고 두 메서드를 모두 찾아서 사용할 수 있었다.
class Solution {
public int solution(int n) {
int answer = 0;
String number = reversedTernary(n);
for (int i = 0; i < number.length(); i += 1) {
char valueInChar = number.charAt(i);
int value = Character.getNumericValue(valueInChar);
answer += value * Math.pow(3, number.length() - 1 - i);
}
return answer;
}
public String reversedTernary(int n) {
int divisor = 3;
int dividend = n;
String number = "";
while(dividend > 0) {
number += dividend % divisor;
dividend /= divisor;
}
return number;
}
}
이번에 자바스크립트를 활용하면서 총 3가지를 알게되었다.
(1) 굳이 join으로 array 형태를 다시 문자열화 하지 않아도, 충분히 array 관련 메서드를 활용해서 오히려(?) 더 편하게 문제를 풀 수 있음
(2) 거듭제곱은 자바와 동일하게 Math.pow(a, b)로 표현할 수 있는데, 밑수 ** 지수 로도 표현이 가능함. -> eslint에서 이렇게 잡아주고 있음
(3) .toString(00진수)로 숫자를 '00진수'로 변환한 값을 문자열로 반환받을 수 있음
3번 내용은 자바스크립트 튜토리얼에서도 확인할 수 있다. 분명 예전에 읽었을텐데... 언제나 까먹는 이 망각의 동물이여.
function solution(n) {
const reversedNumberArray = n.toString(3).split('').reverse();
return reversedNumberArray
.map((value, index) => value * (3 ** (reversedNumberArray.length - 1 - index)))
.reduce((pre, cur) => pre + cur, 0);
}
요 문제는 생각보다 쉽게 풀 수 있었던 계기가 있는데,
예전에 아샬님께서 강의에서 repeat() 메서드를 쓰시는 것을 보면서 그걸 떠올리고 풀어내니 금방 풀렸다.
사실 얻어 걸린 케이스(ㅎㅎ)라고 생각하는데...
새로운 것을 볼 때 그냥 넘어가지 말고 하나라도 머리속에 더 담아두려고 노력해야겠단 생각이 번뜩 든 날이었다.
import java.util.Scanner;
class Solution2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
int i = 0;
while (b > i) {
System.out.println("*".repeat(a));
i += 1;
}
}
}
생각해보니 자바의 Scanner보다도 더 생소한 process.stdin.setEncoding... 뭐시기..
아마 Node와 관련있는 것 같은데 처음에 너무 당황?? 이게 뭐여?? 하다가
정신차리고 금방 풀어낸 문제.
여기서도 동일하게 repeat를 활용할 수 있다는 점에 '아하'..
자꾸 문제에 쫄지말고(ㅎㅎ) 하나씩 풀어내려고 노력하자!!
process.stdin.setEncoding('utf8');
process.stdin.on('data', (data) => {
const n = data.split(' ');
const a = Number(n[0]); const
b = Number(n[1]);
console.log((`${'*'.repeat(a)}\n`).repeat(b));
});