행렬의 덧셈 , 부족한 금액 계산하기 사각별, 이진변환

DeadWhale·2022년 10월 12일
0

프로그래머스

목록 보기
14/21
post-thumbnail

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        int[][] answer = new int[arr1.length][arr1[0].length];
		
		for(int i=0; i<arr1.length; i++){
			for(int j= 0; j<arr1[0].length; j++){
				answer[i][j] =  arr1[i][j] + arr2[i][j];
			}
		}
		
        return answer;
    }
}

단순 2차원 배열 덧셈이다 2차원은 항상 헷갈린다.



새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요.
단, 금액이 부족하지 않으면 0을 return 하세요.

import java.util.*;
class Solution {
    public long solution(int price, int money, int count) {
		long nowPrice = 0;
        for(int i=1; i<=count; i++) nowPrice += (long)price*i;
		return nowPrice>(long)(money)?nowPrice-(long)money:0l;
    }
}

조건에서 Int형 범위를 벗어날수 있다고 힌트를 줬는데
런타임에러가 안떠서 문법 오류인지 알고 시간을 좀 소모 한 것 같다.



입력받은 수만큼 별모양 찍기

import java.util.Scanner;

class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        
        for(int j = 0; j< b; j++ ){
            for(int i =0; i<a; i++){
                System.out.print("*");
            }
               System.out.println("");
        }
    }
}

오랜만에 별찍기라 재미있게 했다.



이진 변환
0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.
x의 모든 0을 제거합니다.
x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.
예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.
0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.

import java.util.*;
class Solution {
    public int[] solution(String s) {
        int answer[] =  new int[2];
        int binaryChange =0;
        int removeZero =0;
      
        
        
while(true){
    if(s.length() == 1){
        answer[0] = binaryChange;
        answer[1] = removeZero;
        break;
    }
    
    //문자열을 리스트로 바꾼다
    List<String> list = new ArrayList<>(Arrays.asList(s.split("")));
    
    //하나씩 탐색하며 0일 경우에 리스트에서 .remove 그리고 카운트 
    for(int i=0; i<list.size(); i++)  if(list.get(i).equals("0")) {
        list.remove(i); 
        removeZero++; }
    
    //리스트에 끝에 도달했을 때 리스트의 길이를 Integer.toBinaryString으로 변환 
    s = Integer.toBinaryString(list.size());
        binaryChange++;    
}
        
        //Integer.toBinaryString
           //반환해야하는 값 {이진변환의 개수} ,{제거한 0의 개수}
        return answer;
    }
}

처음 작성한 코드
주석의 흐름대로 수행하면서 동작한다
하지만 예외가 발생.

예외

  • 문자열 "0"일 경우 제외되면서 인덱스는 증가하는데 리스트의 길이가 줄어들어 스킵되는 문제가 발생.

해결

  • removeZero를 후위증가연산후 . i또한 후위감소연산으로 현재 인덱스와 동기화시킨다.

딱 내 수준의 문제가 재밌게 푼것 같다. 다른 사람들의 풀이를 확인해봤다
전체적으로 내 코드와 다른 점이 크게 없지만 내 코스에서 아쉬운 부분을 찾앗다

나는 while를 무한으로 돌리며 if문으로 브레이크를 했지만. 조건에 !s.equals("1")으로 작성 시
코드를 개선 할 수 있다고 보였다.

0개의 댓글