221230 프로그래머스 3진법 뒤집기, 직사각형 별찍기

샨티(shanti)·2022년 12월 30일
0

코딩테스트

목록 보기
12/35

매일 매일 하루 한 문제씩.
꾸준히 이어가는 코딩테스트 풀이 기록 ✅

오늘은 문제를 2개 풀었다. '3진법 뒤집기', '직사각형 별찍기'
두 문제 모두 어려운 문제는 아니었는데, 진법 문제는 매번 풀때마다 좀 헷갈리는 부분이 있어서 그걸 해결해내는데 조금 시간이 들었고.
직사각형 별찍기의 경우 아주 오랜만에 Scanner 함수를 보면서 갑자기 '...엥?' 하는 생각이 들면서 문제 자체를 파악하는데 시간을 들였다.

결론적으로 두 문제 다 풀긴 했는데, 특히 자바의 경우에는 중첩되는 메서드가 많아지면서 이게 맞는걸까? 하는 의문이 좀 들었고.
자바스크립트의 경우 정말 이번만큼은 for나 while을 사용하지 않을 수 있을까? 란 생각을 했었는데
toString() 메서드를 알면서 뭔가 희망 아닌 희망을...(ㅎㅎㅎㅎㅎ) 갖게 되었고 다행히 원하는 방향대로 풀 수 있었다.

말미에 toString()을 간략히 정리하고 자바스크립트 튜토리얼 링크도 함께 남겨두려 한다.

1. 3진법 뒤집기 문제


문제.


java solution

결국 자바에서 생각해낸 진법 전환은 해당 숫자로 반복 나누기를 진행하는 것이다.
진행하면서 발생하는 나머지를 누적시키는 방법으로 진행했는데 절차를 하나 더 줄이기 위해 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;
    }
}

javascript solution

이번에 자바스크립트를 활용하면서 총 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);
}


2. 직사각형 별찍기


문제.


java solution

요 문제는 생각보다 쉽게 풀 수 있었던 계기가 있는데,
예전에 아샬님께서 강의에서 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;
        }
    }
}

javascript solution

생각해보니 자바의 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));
});

profile
가벼운 사진, 그렇지 못한 글

0개의 댓글