숫자 뒤집기, String()과 toString() 차이 (코문풀 bj-2751번,lc-190번,3번)

장정윤·2021년 4월 7일
0

💻코딩문제풀이

▶학습한 내용 (Javascript)

-숫자를 뒤집기 ex.15 를 51로
숫자 n을 뒤집으려면 n.toString().split("").reverse().join(""); 해준다
cf. 만약 문자열을 뒤집는 경우라면 위 코드에서 toString()작업만 제외하고 하면 된다.

-String()과 toString()
공통점:둘다 숫자 데이터를 문자 데이터로 바꾸려할 때 사용한다.
사용법: String()함수는 String(31)처럼 사용해 변수에 대입하면 되고,
toString() 메서드는 let a=31; b = a.toString();같이 대입하면 된다. b를 출력해보면 31값이 문자형으로 나타나는 것을 볼 수 있다.

🔎백준문제

#2751. 수 정렬하기 2 <난이도:1> 링크

문제 해설: 첫째 줄에 수의 개수 N가 주어지고, 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 수는 중복되지 않는다.
ex)
Input:
5 수의 개수 N
5 N개의 수 입력받음
4
3
2
1
Output: N개의 수 오름차순 정렬
1
2
3
4
5

-문제풀이(python)

array = []
num = 0

n = int(input())
for i in range(0,n):
    num = int(input())
    array.append(num)
    num += 1

for i in range(0,n):
    min = 1001
    cnt = i
    for j in range(cnt,n):
        if min > array[j]:
            min = array[j]
            index = j
    temp = array[i]
    array[i] = array[index]
    array[index] = temp
for i in range(0,n):
    print(array[i])

선택정렬을 활용하여 값을 정렬한 후 출력하였다. 가장 작은 것을 선택해서 맨 앞으로 보내주는 작업을 통해 정렬이 이루어진다. min은 가장 작은 숫자가 일시적으로 담기는 변수이므로 가장 작은 값을 판별하기 위해 초기값은 압도적으로 큰 수를 담아줬다.
선택정렬의 시간 복잡도는 O(N^2)이며, 매번 값을 비교해 작은 수를 맨앞에 놓는 작업을 하기 때문에 조금은 비효율적일 수 있다.

아래는 자바스크립트 함수를 이용해 간단하게 소팅해주었다.

//cf.자바 내장함수를 활용해 소팅하는 방법
let n = parseInt(prompt());
let arr = [];
for(let i=0;i<n;i++){
    arr[i] = parseInt(prompt());        
}
arr.sort((a,b)=>a-b);
for(let i=0;i< arr.length;i++){
    console.log(arr[i]);
}

🔎leetcode

#190. Reverse Bits <난이도:4> 링크

문제 해설: 32자리 2진수 n을 입력받아 reverse한 후 10진수 형태로 값 출력하기.
Input: n = 00000010100101000001111010011100
Output: 964176192 (00111001011110000010100101000000)

-문제풀이(javascript)
2진수를 뒤집기 위해 toString()을 이용해 문자열로 바꾸는 방법을 시도했는데,
값이 뒤집어진채 10진수 값이 되어 어려움을 겪었다.
그래서 시프트연산자를 이용하여 값을 뒤집은 후 10진수 값으로 표현했다.
bit연산의 개념이해와 코드에 적용하기 위해 아래 링크를 참고했다.
-비트연산 개념 이해
-js 비트연산자 실습

정답 코드

var reverseBits = function(n) {
    let result = 0;
    
    for(let i = 0; i < 32; i++) {    
        result <<= 1;  
        result |= n & 1;  
        n >>= 1;
    }
    
    return result >>> 0;
};

간결한 코드로 작성하는 방법이 있지만, 비트연산자 활용이 익숙치 않아 코드가 길어졌다.
비트연산에 대한 공부가 더 필요하므로 이후 직접 푼 코드를 올려 수정하도록 하자.

#3. Longest Substring Without Repeating Characters <난이도:3> 링크

해설: 입력 받은 문자열 s에서 문자가 중복되지 않는 가장 긴 문자열을 출력하는 문제이다.
ex.1
Input: s = "pwwkew"
Output: 3
ex.2
Input: s = "bbbbb"
Output: 1

-문제풀이
(가장 긴 문자 구간의 길이 범위를 찾는데 시간이 많이 걸렸다. 꼭 다시 풀어보자!!!!!)

푼 코드

var lengthOfLongestSubstring = function(s) {
    var k = 0;
    var maxLength = 0;
    for(i = 0; i < s.length; i++) {
        for (j = k; j < i; j++) {
            if (s[i] === s[j]) {
                k = j + 1;
                break;
            }
        }
        if (i - k + 1 > maxLength) {
            maxLength = i - k + 1;
        }
    }
    return maxLength;    
};

문자열의 중복 여부를 판별하고 중복되지 않다면 해당 문자열의 길이 maxlength를 구해 반환한다. 이중 for문을 이용하지 않는 방법을 고심해 봤지만, 문자열 s를 순차적으로 중복판별하기 위해서 이중 for문을 활용하였다.

-난이도 1,2 : 구글링 안하고 직접 푼 문제
-난이도 3: 직접 풀었지만 메서드 구글링한 문제
-난이도 4,5: 직접 못 풀고 답을 참고하여 푼 문제 (꼭 다시 풀어봐야 할 문제)_

다시 풀어볼 문제
앞으로 풀어볼 문제

profile
꾸준히 꼼꼼하게 ✉ Email: jjy306105@gmail.com

0개의 댓글