728x90
https://school.programmers.co.kr/learn/courses/30/lessons/43165
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
프로그래머스에서 이 문제를 풀다 나는 깊이우선 탐색 방식을 사용하여 풀었지만 다른 분들의 코드를 보며 감명 받아서 이를 남기게 되었다
using System;
public class Solution {
public int solution(int[] numbers, int target)
{
int answer = 0;
for(int i = 0; i < Math.Pow(2,numbers.Length); i++)
{
int sum = 0;
int temp = i;
for (int j = 0; j < numbers.Length; j++)
{
if(temp % 2 == 1)
{
sum -= numbers[j];
}
else
{
sum += numbers[j];
}
temp /= 2;
}
if(sum == target)
{
answer++;
}
}
return answer;
}
}
전체 코드는 위에 인데 여기서 핵심은 아래 부분이다
for (int j = 0; j < numbers.Length; j++)
{
if(temp % 2 == 1)
{
sum -= numbers[j];
}
else
{
sum += numbers[j];
}
temp /= 2;
}
이 문제 풀이의 방식의 핵심은 순서대로 + - 부호를 바꿔가며 계산을 완료한뒤 이 값이 target 값과 같은지 확인하는 것이다
여기에서 이 부호 변경을 비트 연산 방식으로 표현하였는데 첫번째 루프일때 temp = 0 이고 이는 0000 하위비트만 봤을때 이다 두번째는 temp = 1이고 이는 0001이다 위에서 temp의 첫번재 비트가 1 이면 -부호를 달아주고 1이아니면 +부호를 달아주며 temp /= 2를 통하여 다음 비트값을 확인하는 방식으로 즉 temp의 값에 따라 몇번째 numbers를 -로 할지를 결정하게 해주는 아름다운 코드였다.
나도 언젠가는 저런생각이 빠르게 나왔으면 좋겠다는 생각을 가지며 글을 마친다
728x90
'알고리즘문제 풀어보기' 카테고리의 다른 글
맨버-마이어스 알고리즘 (0) | 2024.07.15 |
---|---|
C# - 프로그래머스 바탕화면정리 - 문자열 문제 (0) | 2024.03.26 |
c# - Sort할때 실수하는 상황 <Sort>안됨 (0) | 2024.02.20 |
C# 알고리즘 - Combination (0) | 2024.02.19 |
문제풀때 생각해야 할 사항들 (0) | 2023.01.12 |